Android sigue almacenamiento en caché de mis intenciones Extras, cómo declarar una intención pendiente que mantiene frescos los extras?
-
01-10-2019 - |
Pregunta
Hace unos días yo estaba luchando para encontrar una manera de utilizar los intentos personalizados para mis alarmas. A pesar de que tengo una respuesta clara que tengo que personalizar los intentos basados ??en algunos de identificación único ejemplo. setAction()
todavía tienen 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 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 como esto:
- aplicación crea un mensaje para un contacto
- una intención se proporciona con el id de contacto y detalles sobre el mensaje
- notificación se eleva con el mensaje
- usuario Actiones en la notificación y los aplicación muestra el mensaje que se transmite por la intención
El problema
Esto puede ocurrir más de una vez para un contacto. Y cuando se genera el segundo mensaje, la notificación se eleva así (mensaje está bien allí) pero la intención cuando las acciones del usuario que utiliza la notificación de los datos antiguos, por lo que se pasa el mensaje anterior y no el nuevo mensaje de marca.
Así que de alguna manera la intención es el almacenamiento en caché y reutilizar extras anteriores. ¿Cómo puedo hacer que sea único para cada contacto y por acción?
Solución
Si sólo uno de su PendingIntents
para este contacto habrá en circulación en cualquier punto en el tiempo, o si siempre desea utilizar la última serie de extras, el uso FLAG_UPDATE_CURRENT
cuando se crea la PendingIntent
.
Si más de un contacto específico PendingIntent
será excepcional a la vez, y que necesitan tener extras separadas, que tendrá que añadir un recuento o marca de tiempo o algo así para distinguirlos.
intent.setAction("actionstring" + System.currentTimeMillis());
Actualizar
Además, el segundo parámetro documentado ligeramente a getActivity()
y familiares el PendingIntent
aparentemente puede ser utilizado para crear objetos PendingIntent
distintas para el mismo Intent
subyacente, aunque nunca he probado esto.
Otros consejos
Por lo general 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. Nuevos extras anularán los valores antiguos.