2010-06-09 29 views
72

Tengo una cosa de alarma en mi aplicación y se inicia una notificación que luego cuando se presiona lanzó una actividad. El problema es que cuando creo más de una alarma, la actividad iniciada desde la notificación obtiene los mismos extras que la primera. Creo que el problema es con la intención que puse en el intento pendiente o en el intento pendiente en sí. Creo que podría necesitar poner una bandera en uno de estos, pero no sé cuál.android pendiente de notificación de intención problema

Intent showIntent =new Intent(context, notificationreceiver.class); 
    showIntent.putExtra("details", alarmname); 

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, 
     showIntent, 0); 

    notification.setLatestEventInfo(context, "The event is imminent", 
      alarmname, contentIntent); 

y el receptor de la notificación

Bundle b = getIntent().getExtras(); 
    String eventname = b.getString("details"); 
    details.setText(eventname); 

Los "detalles" extra es el mismo para todos los que la próxima vez que ocurre una notificación en lugar de tener el valor diferente. Hasta que establezca los intentos, estoy seguro de que el valor correcto va a los "detalles", por lo que es un problema de obtener el primer intento cada vez que presiono una notificación. ¿Cómo puedo hacerlo para lanzar los intentos correctos? Espero que fuera tan claro como pude Gracias!

+0

Lo que sí se dado que estoy usando un único ID de notificación para hacer un seguimiento de los estados (notificación de la barra de estado), utilizo la misma variable para pasar a mi PendingIntent, lo que lo hace único. –

Respuesta

68

El problema es que cuando se crea más de una alarma entonces la actividad lanzado desde la notificación se pone los mismos extras como la primera.

Correcto.

¿Cómo puedo hacer para lanzar el intentos correctos?

Eso depende de si tiene dos alarmas que se registrarán a la vez, o no.

Si no, puede use FLAG_ONE_SHOT or one of the other PendingIntent flags tener su segundo PendingIntent con los nuevos extras.

Si, sin embargo, tendrá dos alarmas registradas a la vez, con diferentes Intent extras, que se necesitan para hacer que los dos Intents ser más materialmente diferentes, de tal manera que filterEquals() vuelve false al comparar los dos. Por ejemplo, puede llamar al setData() o setAction() y proporcionar valores diferentes para cada Intent.

+2

Hombre muchas gracias por la ayuda. Debido a que existe la posibilidad de tener alarmas funcionando juntas y tener más de una notificación en la barra de notificaciones, utilicé el indicador FLAG_UPDATE_CURRENT para el intento pendiente. Pero el verdadero problema fue como dijiste para establecer la Acción en el intento con el nombre de la alarma y ahora podría saber qué intenciones son diferentes y qué es lo mismo. ¡Gracias de nuevo! – spagi

+2

setAction funcionó para mí también. Me pregunto por qué el SDK oficial no lo menciona. –

+0

setAction funciona, gracias a TON. Usar setAction me ayudó a diferenciar todos los elementos pendientes, ¡simplemente increíble! – Soham

116

La forma en que se resolvió el problema fue asignando una única requestCode cuando obtiene el PendingIntent:

PendingIntent.getActivity(context, requestCode, showIntent, 0); 

De esta manera se está registrando en el sistema diferentes instancias Intención/únicas. Consejo: Una buena forma de hacer único el requestCode sería pasándole la hora actual del sistema.

int requestID = (int) System.currentTimeMillis(); 
+9

¡requestCode no ha sido utilizado por nada hasta ahora, pero sí hace que los intentos sean únicos lo que evita que se sobrescriban! Excelente trabajo u-ramos! – Kitteh

+1

Incluso si 'TaskStackBuilder' se está utilizando, tenemos un método allí' getPendingIntent (int requestCode, int flags) '. Aquí se puede pasar este requestID. –

+1

Tenga cuidado, currentTimeMillis es tipo largo, por lo que si lo convierte en int, se truncará. No sé qué tan probable es y si es importante, pero podría repetirse. En ese caso, puede usar un valor estático incrementado – djpeinado

1

otra solución:

utiliza el PendingIntent.FLAG_UPDATE_CURRENT así:

PendingIntent contentIntent = PendingIntent.getActivity(this, 0,i, PendingIntent.FLAG_UPDATE_CURRENT); 

esta trabajado para mí

+0

Esto no funciona. Reemplaza los parámetros anteriores y reemplaza con los nuevos –

0

tuve este problema en mi aplicación y apenas genera un número aleatorio a venir más anulando las notificaciones de intención:

int random= new Random().nextInt(); 
PendingIntent resultPendingIntent = 
     stackBuilder.getPendingIntent(
       random, 
       PendingIntent.FLAG_UPDATE_CURRENT 
    ); 
Cuestiones relacionadas