Il y a quelques jours, j’ai eu du mal à trouver un moyen d’utiliser des intentions personnalisées pour mes alarmes. Bien que je reçoive une réponse claire, je dois personnaliser les intentions en fonction d’un identifiant unique, par exemple. setAction()
toujours des problèmes.
Je définis un PendingIntent de cette façon:
Intent intent = new Intent(this, viewContactQuick.class); intent.setAction("newmessage"+objContact.getId());//unique per contact intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK ).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP ); intent.putExtra("id", Long.parseLong(objContact.getId())); intent.putExtra("results", result.toArray()); PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, 0);
alors c’est utilisé par un gestionnaire de notification
NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(ns); // first try to clear any active notification with this contact ID mNotificationManager.cancel(Integer.parseInt(objContact.getId())); // then raise a new notification for this contact ID mNotificationManager.notify(Integer.parseInt(objContact.getId()), notification);
Cela fonctionne comme ceci:
Le problème
Cela peut se produire plus d’une fois pour un contact. Et lorsque le deuxième message est généré, la notification est bien déclenchée (le message est correct), mais lorsque l’utilisateur actionne la notification, il utilise d’anciennes données. Le message précédent est transmis et non le tout nouveau message.
L’intention est donc de mettre en cache et de réutiliser les extras précédents. Comment puis-je le rendre unique par contact et par action?
Si un seul de vos PendingIntents
pour ce contact est en PendingIntents
à un moment donné, ou si vous souhaitez toujours utiliser le dernier ensemble d’extras, utilisez FLAG_UPDATE_CURRENT
lorsque vous créez le PendingIntent
.
Si plusieurs PendingIntent
spécifiques à un contact sont en PendingIntent
à la fois, et qu’ils doivent avoir des options distinctes, vous devrez append un nombre ou un horodatage ou quelque chose pour les distinguer.
intent.setAction("actionssortingng" + System.currentTimeMillis());
METTRE À JOUR
De même, le second paramètre peu documenté de getActivity()
et kin sur PendingIntent
peut apparemment être utilisé pour créer des objects PendingIntent
distincts pour le même Intent
sous-jacent, bien que je PendingIntent
jamais essayé ceci.
Je spécifie généralement un unique requestCode pour empêcher mes PendingIntents de se substituer:
PendingIntent pending = PendingIntent.getService(context, unique_id, intent, 0);
Et dans votre cas, je suis d’accord avec CommonsWare, vous avez juste besoin de l’indicateur FLAG_UPDATE_CURRENT. Les nouveaux extras remplaceront les anciennes valeurs.