Android guarda en el caché mis intenciones Extras, ¿cómo declarar un bash pendiente que mantiene nuevos extras?

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 tiene algunos problemas.

Defino un PendingIntent de 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 esto es usado por un administrador 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í:

  • la aplicación crea un mensaje para un contacto
  • se proporciona una intención con la identificación de contacto y detalles sobre el mensaje
  • la notificación se plantea con el mensaje
  • acciones del usuario en la notificación y la aplicación muestra el mensaje pasado 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 plantea bien (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.

De alguna manera, la intención es almacenar en caché y reutilizar extras anteriores. ¿Cómo puedo hacerlo único por contacto y por acción?

Si solo uno de sus contactos PendingIntents para este contacto estará pendiente en algún momento, o si siempre quiere usar el último conjunto de extras, use FLAG_UPDATE_CURRENT cuando cree el PendingIntent .

Si hay más de un PendingIntent específico de PendingIntent pendiente a la vez, y necesitan tener extras por separado, deberá agregar un recuento o sello de tiempo o algo para distinguirlos.

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

ACTUALIZAR

Además, el segundo parámetro ligeramente documentado para getActivity() y kin en PendingIntent aparentemente se puede usar para crear distintos objetos PendingIntent para el mismo Intent subyacente, aunque nunca lo he intentado.

Normalmente especifico unique requestCode para evitar que mis PendingIntents se anulen entre sí:

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

Y en su caso, estoy de acuerdo con CommonsWare, solo necesita el indicador FLAG_UPDATE_CURRENT. Los nuevos extras anularán los valores anteriores.