La notification passe les anciens Intent Extras

Je crée une notification dans un BroadcastReceiver via ce code:

Ssortingng 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); 

Quand je clique sur la notification, cela ouvre la NotificationActivity et à l’intérieur de l’activité je peux récupérer le foo_id du paquet d’intention (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 Intent-Bundle. J’ai essayé d’effacer le bundle avec clear (), mais je reçois le même effet. Je pense que sth a tort avec mon code ..

Vous envoyez le même code de demande pour votre intensif en attente. Change ça:

 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 parameters. Ils sont réutilisés.

Vous pouvez également utiliser le code suivant pour générer votre PendingIntent:

 PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

À partir 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 celles contenues dans cette nouvelle intention. 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 ancien PendingIntent pourront le lancer avec vos nouveaux extras, même si elles ne leur sont pas explicitement données.

Vous transmettez 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 une longue période de temps, tout ce dont vous avez besoin est de passer le dernier argument de PendingIntent.FLAG_UPDATE_CURRENT, 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.

Votre code de demande est 0 pour toute la notification. Changer la ligne suivante:

 PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); 

Avec:

 PendingIntent contentIntent = PendingIntent.getActivity(context, new Random().nextInt(), notificationIntent, 0);