web-dev-qa-db-fra.com

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

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:

  • l'application crée un message pour un contact
  • une intention est fournie avec l'identifiant du contact et les détails du message
  • une notification est émise avec le message
  • l'action 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 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?

62
Pentium10

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.

95
CommonsWare

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.

34
Fedor