je crée une notification à l'intérieur d'un BroadcastReceiver via ce code:
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(ns);
int icon = R.drawable.ic_stat_notification;
CharSequence tickerText = "New Notification";
long when = System.currentTimeMillis();
Notification notification = new Notification(icon, tickerText, when);
notification.defaults |= Notification.DEFAULT_VIBRATE;
long[] vibrate = {0,100,200,200,200,200};
notification.vibrate = vibrate;
notification.flags |= Notification.FLAG_AUTO_CANCEL;
CharSequence contentTitle = "Title";
CharSequence contentText = "Text";
Intent notificationIntent = new Intent(context, NotificationActivity.class);
notificationIntent.putExtra(Global.INTENT_EXTRA_FOO_ID, foo_id);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
int mynotification_id = 1;
mNotificationManager.notify(mynotification_id, notification);
Lorsque je clique sur la notification, il ouvre NotificationActivity et, à l'intérieur de l'activité, je peux récupérer le foo_id dans Intent-Bundle (par exemple 1).
Cependant, si une autre notification est déclenchée et que je clique à nouveau dessus, l'activité reçoit toujours la "vieille" valeur (1) de l'ensemble Intent. J'ai essayé d'effacer le paquet avec clear (), mais je reçois le même effet. Je pense que qc a tort avec mon code ..
Vous envoyez le même code de demande pour votre attente en attente . Modifiez ceci:
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
À:
PendingIntent contentIntent = PendingIntent.getActivity(context, UNIQUE_INT_PER_CALL, notificationIntent, 0);
les intentions ne sont pas créées si vous envoyez les mêmes paramètres. Ils sont réutilisés.
Sinon, vous pouvez utiliser le code suivant pour générer votre PendingIntent:
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
De la doc pour PendingIntent.FLAG_UPDATE_CURRENT
:
Si le PendingIntent décrit existe déjà, conservez-le, mais remplacez ses données supplémentaires par le contenu de ce nouvel Intent. Cela peut être utilisé si vous créez des intentions où seuls les extras changent, et ne vous souciez pas du fait que les entités ayant reçu votre PendingIntent précédent pourront le lancer avec vos nouveaux extras même si elles ne leur sont pas explicitement données.
Vous passez le même identifiant. Dans ce genre de situation, créez un identifiant unique à partir du temps comme ceci:
int iUniqueId = (int) (System.currentTimeMillis() & 0xfffffff);
Et le mettre comme ceci:
PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(),iUniqueId, intentForNotification, 0);
Pour ceux qui recherchent la meilleure approche après longtemps, il vous suffit de passer le PendingIntent.FLAG_UPDATE_CURRENT comme dernier argument, comme indiqué ci-dessous.
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
vous n'avez même pas besoin de fournir un nouvel identifiant unique.
Je voulais juste ajouter une autre option
PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_ONE_SHOT | PendingIntent.FLAG_IMMUTABLE);
Votre code de demande est 0 pour toutes les notifications. Changer de ligne suivante:
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
Avec:
PendingIntent contentIntent = PendingIntent.getActivity(context, new Random().nextInt(), notificationIntent, 0);