intent - notification activity in android
¿Cómo enviar parámetros desde una notificación-clic a una actividad? (12)
¡Es fácil, esta es mi solución usando objetos!
Mi POJO
public class Person implements Serializable{
private String name;
private int age;
//get & set
}
Notificación de método
Person person = new Person();
person.setName("david hackro");
person.setAge(10);
Intent notificationIntent = new Intent(this, Person.class);
notificationIntent.putExtra("person",person);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.notification_icon)
.setAutoCancel(true)
.setColor(getResources().getColor(R.color.ColorTipografiaAdeudos))
.setPriority(2)
.setLargeIcon(bm)
.setTicker(fotomulta.getTitle())
.setContentText(fotomulta.getMessage())
.setContentIntent(PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT))
.setWhen(System.currentTimeMillis())
.setContentTitle(fotomulta.getTicketText())
.setDefaults(Notification.DEFAULT_ALL);
Nueva actividad
private Person person;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_notification_push);
person = (Person) getIntent().getSerializableExtra("person");
}
¡¡Buena suerte!!
Puedo encontrar una forma de enviar parámetros a mi actividad desde mi notificación.
Tengo un servicio que crea una notificación. Cuando el usuario hace clic en la notificación, quiero abrir mi actividad principal con algunos parámetros especiales. Por ejemplo, una identificación de artículo, por lo que mi actividad puede cargarse y presentar una vista de detalles de elementos especiales. Más específicamente, estoy descargando un archivo, y cuando el archivo se descarga quiero que la notificación tenga la intención de que cuando se haga clic abra mi actividad en un modo especial. Intenté usar putExtra
en mi intento, pero parece que no puedo extraerlo, así que creo que lo estoy haciendo mal.
Código de mi servicio que crea la Notificación:
// construct the Notification object.
final Notification notif = new Notification(R.drawable.icon, tickerText, System.currentTimeMillis());
final RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.custom_notification_layout);
contentView.setImageViewResource(R.id.image, R.drawable.icon);
contentView.setTextViewText(R.id.text, tickerText);
contentView.setProgressBar(R.id.progress,100,0, false);
notif.contentView = contentView;
Intent notificationIntent = new Intent(context, Main.class);
notificationIntent.putExtra("item_id", "1001"); // <-- HERE I PUT THE EXTRA VALUE
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
notif.contentIntent = contentIntent;
nm.notify(id, notif);
Código de mi actividad que intenta obtener el parámetro adicional de la notificación:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Bundle extras = getIntent().getExtras();
if(extras != null){
Log.i( "dd","Extra:" + extras.getString("item_id") );
}
Los extras siempre son nulos y nunca obtengo nada en mi registro.
Por cierto ... el onCreate
solo se ejecuta cuando se inicia mi actividad, si mi actividad ya está comenzada también quiero recoger los extras y presentar mi actividad de acuerdo con el item_id que recibo.
¿Algunas ideas?
Después de hacer algunas búsquedas obtuve una solución de la guía para desarrolladores de Android
PendingIntent contentIntent ;
Intent intent = new Intent(this,TestActivity.class);
intent.putExtra("extra","Test");
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(ArticleDetailedActivity.class);
contentIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
Para obtener un valor adicional en la clase de actividad de prueba, debe escribir el siguiente código:
Intent intent = getIntent();
String extra = intent.getStringExtra("extra") ;
Después de leer algunas listas de correo electrónico y otros foros, descubrí que el truco parece agregar algunos datos únicos a la intención.
Me gusta esto:
Intent notificationIntent = new Intent(Main.this, Main.class);
notificationIntent.putExtra("sport_id", "sport"+id);
notificationIntent.putExtra("game_url", "gameURL"+id);
notificationIntent.setData((Uri.parse("foobar://"+SystemClock.elapsedRealtime())));
No entiendo por qué es necesario hacer esto, tiene algo que ver con la intención de no ser identificado solo por sus extras ...
Eche un vistazo a esta guía ( creando una notificación ) y muestree ApiDemos "StatusBarNotifications" y "NotificationDisplay".
Para gestionar si la actividad ya se está ejecutando, tiene dos formas:
Agregue el indicador FLAG_ACTIVITY_SINGLE_TOP al Intento cuando lance la actividad y luego en la clase de actividad implemente el controlador de eventos onNewIntent (intención intencional) , de esa manera puede acceder al nuevo intento que fue llamado para la actividad (que no es lo mismo que llamar a getIntent (), esto siempre devolverá la primera intención que inició su actividad.
Igual que el número uno, pero en lugar de agregar un indicador al Intento, debe agregar "singleTop" en su actividad AndroidManifest.xml.
Si usa extras de intención, PendingIntent.getActivity()
llamar a PendingIntent.getActivity()
con el indicador PendingIntent.FLAG_UPDATE_CURRENT
, de lo contrario los mismos extras se reutilizarán para cada notificación.
Encuentro el mismo problema aquí. Lo resuelvo utilizando un código de solicitud diferente, uso la misma identificación como notificación, mientras creo PendingIntent. pero todavía no sé por qué esto debe hacerse.
PendingIntent contentIntent = PendingIntent.getActivity(context, **id**, notificationIntent, 0);
notif.contentIntent = contentIntent;
nm.notify(**id**, notif);
Intenté todo, pero nada funcionó.
finalmente se le ocurrió la siguiente solución.
1- en manifestar agregar para la actividad android: launchMode = "singleTop"
2- Al realizar un intento pendiente, haga lo siguiente, use el paquete en lugar de usar directamente intent.putString () o intent.putInt ()
Intent notificationIntent = new Intent(getApplicationContext(), CourseActivity.class);
Bundle bundle = new Bundle();
bundle.putString(Constants.EXAM_ID,String.valueOf(lectureDownloadStatus.getExamId()));
bundle.putInt(Constants.COURSE_ID,(int)lectureDownloadStatus.getCourseId());
bundle.putString(Constants.IMAGE_URL,lectureDownloadStatus.getImageUrl());
notificationIntent.putExtras(bundle);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(),
new Random().nextInt(), notificationIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
Si utiliza
android:taskAffinity="myApp.widget.notify.activity"
android:excludeFromRecents="true"
en su archivo AndroidManifest.xml para que se inicie la actividad, debe usar lo siguiente en su intento:
Intent notificationClick = new Intent(context, NotifyActivity.class);
Bundle bdl = new Bundle();
bdl.putSerializable(NotifyActivity.Bundle_myItem, myItem);
notificationClick.putExtras(bdl);
notificationClick.setData(Uri.parse(notificationClick.toUri(Intent.URI_INTENT_SCHEME) + myItem.getId()));
notificationClick.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); // schließt tasks der app und startet einen seperaten neuen
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addParentStack(NotifyActivity.class);
stackBuilder.addNextIntent(notificationClick);
PendingIntent notificationPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(notificationPendingIntent);
Importante es establecer datos únicos, por ejemplo, usando una identificación única como:
notificationClick.setData(Uri.parse(notificationClick.toUri(Intent.URI_INTENT_SCHEME) + myItem.getId()));
Tal vez un poco tarde, pero: en lugar de esto:
public void onNewIntent(Intent intent){
Bundle extras = intent.getExtras();
Log.i( "dbg","onNewIntent");
if(extras != null){
Log.i( "dbg", "Extra6 bool: "+ extras.containsKey("net.dbg.android.fjol"));
Log.i( "dbg", "Extra6 val : "+ extras.getString("net.dbg.android.fjol"));
}
mTabsController.setActiveTab(TabsController.TAB_DOWNLOADS);
}
Utilizar esta:
Bundle extras = getIntent().getExtras();
if(extras !=null) {
String value = extras.getString("keyName");
}
Tuve el problema similar de que mi aplicación muestra notificaciones de mensajes. Cuando hay varias notificaciones y hace clic en cada notificación, muestra ese detalle de notificación en una actividad de mensaje de vista. Resolví el problema de que se reciban los mismos parámetros adicionales a la vista del intento de mensaje.
Aquí está el código que solucionó esto. Código para crear la intención de notificación.
Intent notificationIntent = new Intent(getApplicationContext(), viewmessage.class);
notificationIntent.putExtra("NotificationMessage", notificationMessage);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingNotificationIntent = PendingIntent.getActivity(getApplicationContext(),notificationIndex,notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.setLatestEventInfo(getApplicationContext(), notificationTitle, notificationMessage, pendingNotificationIntent);
Código para ver la actividad del mensaje.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
onNewIntent(getIntent());
}
@Override
public void onNewIntent(Intent intent){
Bundle extras = intent.getExtras();
if(extras != null){
if(extras.containsKey("NotificationMessage"))
{
setContentView(R.layout.viewmain);
// extract the extra-data in the Notification
String msg = extras.getString("NotificationMessage");
txtView = (TextView) findViewById(R.id.txtMessage);
txtView.setText(msg);
}
}
}
Utilice como PendingIntent mientras se muestra la notificación de lo que se resolverá.
PendingIntent intent = PendingIntent.getActivity (this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Agregue PendingIntent.FLAG_UPDATE_CURRENT como último campo.
para Servicios use PendingIntent.FLAG_UPDATE_CURRENT
para mi trabajo
AndroidManifest.xml
Incluir launchMode = "singleTop"
<activity android:name=".MessagesDetailsActivity"
android:launchMode="singleTop"
android:excludeFromRecents="true"
/>
SMSReceiver.java
Establezca las banderas para el Intent and PendingIntent
Intent intent = new Intent(context, MessagesDetailsActivity.class);
intent.putExtra("smsMsg", smsObject.getMsg());
intent.putExtra("smsAddress", smsObject.getAddress());
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent contentIntent = PendingIntent.getActivity(context, notification_id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
MessageDetailsActivity.java
onResume (): se llama cada vez, carga los extras.
Intent intent = getIntent();
String extraAddress = intent.getStringExtra("smsAddress");
String extraBody = intent.getStringExtra("smsMsg");
Espero que ayude, se basó en otras respuestas aquí en , pero esta es la más actualizada que funcionó para mí.