Android continue de mettre en cache mes intentions Extras, comment déclarer une intention en attente qui conserve des extras frais?

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:

  • l’application crée un message pour un contact
  • une intention est fournie avec l’ID de contact et des détails sur le message
  • la notification est déclenchée avec le message
  • les actions de l’utilisateur sur la notification et l’application affiche le message transmis par l’intention

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.