Je crée une notification dans 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, cela ouvre la NotificationActivity et à l'intérieur de l'activité, je peux récupérer le foo_id du Intent-Bundle (par exemple 1)
Cependant, si une autre notification est déclenchée et que je clique dessus à nouveau, l'activité reçoit toujours la «vieille» valeur (1) de l'Intention-Bundle. J'ai essayé d'effacer le paquet avec clear (), mais je reçois le même effet. Je pense que qc est faux avec mon code ..
Réponses:
Vous envoyez le même code de demande pour votre intens en attente. Change ça:
À:
les intentions ne sont pas créées si vous envoyez les mêmes paramètres. Ils sont réutilisés.
la source
Intent
qui a des extras différents (viaputExtra
) est considéré comme le même et réutilisé parce que je n'ai pas fourni un identifiant unique à un appel d'intention en attente - terrible apiVous pouvez également utiliser le code suivant pour générer votre PendingIntent:
De la doc pour
PendingIntent.FLAG_UPDATE_CURRENT
:la source
Vous transmettez le même identifiant. Dans ce genre de situation, créez un identifiant unique comme ceci:
Et dites-le comme ceci:
la source
System.currentTimeMillis()
renvoie un long, tandis que lerequestId
paramètre dePendingIntent.getActivity()
prend un int.0xffffffff
est un masque binaire. Bien qu'il y ait un peu plus à cela, l'explication simple est que faire `long & 0xffffffff 'donne les 32 bits les plus bas du long et rejette les 32 bits les plus élevés, vous laissant essentiellement un int 32 bits. C'est mieux que de simplement lancer un int, car cela ne gâchera pas le bit de signe (si vous lancez un long qui est plus grand qu'un int en un int, le bit de signe débordera et vous vous retrouverez potentiellement avec une valeur négative )Pour tous ceux qui recherchent la meilleure approche après une longue période, vous devez transmettre PendingIntent.FLAG_UPDATE_CURRENT comme dernier argument, comme indiqué ci-dessous
vous n'avez même pas besoin de fournir un nouvel identifiant unique.
Vous devez le faire pour la prochaine fois, pas pour la première fois
la source
Votre code de demande est 0 pour toutes les notifications. Changer la ligne suivante:
Avec:
la source
Je voulais juste ajouter une autre option
la source