2010-06-29 11 views
57

Hace unos días estaba luchando por encontrar una forma de usar intenciones personalizadas para mis alarmas. Aunque obtuve una respuesta clara, tengo que personalizar los Intents basados ​​en alguna identificación única, por ej. setAction() todavía tienen algunos problemas.Android mantiene en el caché mis intenciones Extras, ¿cómo declarar un intento pendiente que mantiene nuevos extras?

defino un PendingIntent esta manera:

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); 

entonces este es utilizada por un gestor de notificaciones

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); 

Esto funciona así:

  • aplicación crea un mensaje para una contacto
  • se proporciona una intención ingenio h el ID de contacto y detalles sobre el mensaje
  • notificación se eleva con el mensaje
  • usuario actiones en la notificación y la aplicación muestra el mensaje que se transmite por la intención

El problema

Esto puede suceder más de una vez por un contacto. Y cuando se genera el segundo mensaje, la notificación se presenta correctamente (el mensaje está bien allí) pero la intención cuando el usuario actúa la notificación utiliza datos antiguos, por lo que se pasa el mensaje anterior y no el nuevo.

Por lo tanto, la intención es almacenar en caché y reutilizar los extras anteriores. ¿Cómo puedo hacerlo único por contacto y por acción?

+0

¿Hay alguna forma de eliminar todos los IntentExtras en caché? Supongo que lo arreglé ahora, pero todavía quedan otras Intenciones almacenadas en caché ... – OneWorld

+0

Puede surgir un problema similar dependiendo de los indicadores de intención o del modo de lanzamiento de una actividad.En este caso, deberá verificar [Activity :: onNewIntent] (http://j.mp/ieXMCA), ya que Activity :: getIntent devolverá el intento ORIGINAL de la actividad, no el nuevo intento con la acción/extras actualizada./etc. – brack

Respuesta

89

Si solo uno de sus PendingIntents para este contacto será sobresaliente en algún momento, o si siempre quiere usar el último conjunto de extras, use FLAG_UPDATE_CURRENT al crear el PendingIntent.

Si hay más de un contacto específico PendingIntent sobresaliente a la vez, y necesitan tener extras por separado, tendrá que agregar un conteo o marca de tiempo o algo para distinguirlos.

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

ACTUALIZACIÓN

También, el segundo parámetro documentado ligeramente-a getActivity() y parientes en PendingIntent aparentemente puede ser usado para crear distintas PendingIntent objetos para el mismo subyacente Intent, aunque nunca he intenté esto.

+1

Terminé agregando una marca de tiempo a la acción. – Pentium10

+7

hombre, tienes todas las respuestas –

+1

¡increíble! utilicé mi ID de widget actual para separarlos (también permite cierto nivel de almacenamiento en caché). – DavidG

29

generalmente especifico requestCode única para evitar que mis PendingIntents anulen entre sí:

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

Y en su caso estoy de acuerdo con CommonsWare sólo tiene bandera FLAG_UPDATE_CURRENT. Los nuevos extras anularán los valores anteriores.

+4

Esa es la solución real – ognian

+1

Eso no es suficiente para mantener su PendingIntent colisionará entre sí. También debe usar PendingIntent.FLAG_UPDATE_CURRENT –

+0

y generar un unique_id aquí es una buena solución 'int unique_id = (int) System.currentTimeMillis();' –

Cuestiones relacionadas