android - data - intent-filter
Android guarda en el caché mis intenciones Extras, ¿cómo declarar un intento pendiente que mantiene nuevos extras? (2)
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.
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.