Il y a quelques jours, je luttais pour trouver un moyen d'utiliser des intentions personnalisées pour mes alarmes. Bien que j'ai obtenu une réponse claire, je dois personnaliser les intentions en fonction d'un ID unique, par exemple. setAction()
a encore quelques 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 cela est utilisé par un gestionnaire de notifications
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 bien là-bas) mais l'intention lorsque l'utilisateur actionne la notification utilise des données anciennes, donc le message précédent est passé et non le tout nouveau message.
Donc, d'une manière ou d'une autre, l'intention est 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 sera en suspens à 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 au contact sont en suspens à la fois, et qu'ils doivent avoir des extras séparés, vous devrez ajouter un nombre ou un horodatage ou quelque chose pour les distinguer.
intent.setAction("actionstring" + System.currentTimeMillis());
MISE À JOUR
De plus, le second paramètre légèrement documenté de getActivity()
et kin sur PendingIntent
peut apparemment être utilisé pour créer des objets PendingIntent
distincts pour le même Intent
sous-jacent, même si je n'ai jamais essayé ça.
Je spécifie généralement un requestCode unique pour empêcher mes PendingIntents de se remplacer les uns les autres:
PendingIntent pending = PendingIntent.getService(context, unique_id, intent, 0);
Et dans votre cas, je suis d'accord avec Commons, vous avez juste besoin du drapeau FLAG_UPDATE_CURRENT. Les nouveaux extras remplaceront les anciennes valeurs.