Android sigue almacenamiento en caché de mis intenciones Extras, cómo declarar una intención pendiente que mantiene frescos los extras?

StackOverflow https://stackoverflow.com/questions/3140072

  •  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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top