62 votes

Android continue de la mise en cache mes intentions Extras, comment déclarer une attente d'intention qui garde frais extras?

Il y A quelques jours j'ai eu du mal à trouver un moyen pour utiliser les intentions de mes alarmes. Bien que j'ai obtenu de réponse claire à la question que j'ai pour personnaliser les Intentions basée sur quelques ID unique par exemple. setAction() encore quelques problèmes.

Je définir 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 il 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
  • l'intention est fourni avec l'id du contact et de détails sur le message
  • la notification est générée avec le message
  • l'utilisateur actiones 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 quand le deuxième message est généré, la notification est soulevée (le message est bien là) mais l'intention lorsque les actions de l'utilisateur la notification qu'il utilise de vieilles données, le message précédent est passé et pas le tout nouveau message.

Donc, d'une certaine manière l'objectif est la mise en cache et la réutilisation des précédentes extras. Comment puis-je le rendre unique par contact et par l'action?

96voto

CommonsWare Points 402670

Si un seul de vos PendingIntents de ce contact sera exceptionnelle à tout point dans le temps, ou si vous voulez toujours utiliser la dernière série de suppléments, l'utilisation FLAG_UPDATE_CURRENT lorsque vous créez l' PendingIntent.

Si plus d'un contact spécifique PendingIntent seront en circulation à la fois, et ils ont besoin d'avoir séparé les extras, vous aurez besoin d'ajouter un nombre ou un timestamp ou quelque chose pour les distinguer.

intent.setAction("actionstring" + System.currentTimeMillis());

Mise à JOUR

Aussi, le peu documenté deuxième paramètre getActivity() et kin sur PendingIntent apparemment peut être utilisé pour créer des PendingIntent des objets de la même sous-jacent Intent, bien que je n'ai jamais essayé ce.

34voto

Fedor Points 29890

J'ai l'habitude de spécifier unique requestCode pour empêcher mon PendingIntents d'écraser les uns les autres:

PendingIntent pending = PendingIntent.getService(context, unique_id, intent, 0);

Et dans votre cas, je suis d'accord avec CommonsWare vous avez juste besoin FLAG_UPDATE_CURRENT drapeau. Nouvelles fonctionnalités vont remplacer les anciennes valeurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X