2010-06-29 2 views
57

Il y a quelques jours, j'avais du mal à 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() ont encore quelques problèmes.Android conserve la mise en cache de mes intentions Extras, comment déclarer une intention en attente qui conserve les frais supplémentaires?

Je définis PendingIntent 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 une contact
  • une intention est fournie wit h l'identifiant de contact et les détails sur le message
  • notification
  • est soulevée avec le message
  • actiones utilisateur sur la notification et l'application affiche le message transmis par l'intention

Le problème

Cela peut arriver plus d'une fois pour un contact. Et quand le deuxième message est généré, la notification est bien levée (le message y est bon) mais l'intention quand l'utilisateur actionne la notification qu'il utilise des anciennes données, donc le message précédent est passé et non le tout nouveau message.

Donc, de toute façon, l'intention est la mise en cache et la réutilisation des extras précédents. Comment puis-je le rendre unique par contact et par action?

+0

Existe-t-il un moyen d'effacer tous les IntentExtras en cache? Je suppose que je l'ai corrigé maintenant, mais les intentions plus anciennes en cache restent ... – OneWorld

+0

Un problème similaire peut survenir en fonction des indicateurs de l'intention ou du mode de lancement d'une activité.Dans ce cas, vous devrez cocher [Activity :: onNewIntent] (http://j.mp/ieXMCA), car Activity :: getIntent retournera l'intention ORIGINAL de l'activité, pas la nouvelle intention avec l'action/les extras mis à jour /etc. – brack

Répondre

89

Si un seul de vos PendingIntents pour ce contact sera en cours à tout moment, ou si vous souhaitez toujours utiliser la dernière série d'extras, utilisez FLAG_UPDATE_CURRENT lorsque vous créez le PendingIntent.

Si plus d'un PendingIntent spécifique au contact est en attente et qu'il doit disposer d'extras séparés, vous devez ajouter un nombre ou un horodatage ou quelque chose pour les distinguer.

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

MISE À JOUR

En outre, le second paramètre légèrement documenté pour getActivity() et parents sur PendingIntent peut apparemment être utilisé pour créer des objets PendingIntent distincts pour la même Intent sous-jacente, bien que je n'ai jamais essayé ça.

+1

J'ai fini par ajouter un horodatage à l'action. – Pentium10

+7

homme, vous avez toutes les réponses –

+1

génial! J'ai utilisé mon ID de widget actuel pour les séparer (permettant également un certain niveau de mise en cache). – DavidG

29

Je précise habituellement requestCode unique pour empêcher mes PendingIntents de surcharger l'autre:

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

Et dans votre cas, je suis d'accord avec CommonsWare vous avez juste besoin drapeau FLAG_UPDATE_CURRENT. De nouveaux extras remplaceront les anciennes valeurs.

+4

Voilà la vraie solution – ognian

+1

Cela ne suffit pas de garder votre PendingIntent de se heurter les uns aux autres. Vous devez également utiliser PendingIntent.FLAG_UPDATE_CURRENT –

+0

et pour générer un unique_id voici une bonne solution 'int unique_id = (int) System.currentTimeMillis();' –

Questions connexes