2010-06-27 8 views
32

Esta pregunta de alguna manera se relaciona con la pregunta cuando estaba buscando get the extras back in startActivityForResult pero ahora me enfrento a otro desafío.¿Por qué PendingIntent no devuelve la configuración de Extras personalizada para Intent?

Me he suscrito para recibir ProximityAlerts y he creado explícitamente la intención de incluir algunos extras. Pero cuando recibí el servicio, los extras no están allí.

Después de las respuestas aquí es el código de trabajo:

Intent intent = new Intent(this, PlacesProximityHandlerService.class); 
intent.setAction("PlacesProximityHandlerService"); 
intent.putExtra("lat", objPlace.getLat()); 
intent.putExtra("lon", objPlace.getLon()); 
intent.putExtra("error_m", objPlace.getError()+ALERT_RANGE_IN_METERS); 
PendingIntent sender=PendingIntent.getService(this, 0, intent, 0); 
LocationUtils.addProximity(this, objPlace.getLat(), objPlace.getLon(),objPlace.getError()+ALERT_RANGE_IN_METERS, -1, sender); 

La documentación dice parámetro PendingIntent to be sent for each location update

Respuesta

40

Por algún motivo no especificado, los extras se entregarán solo si ha establecido alguna acción, por ejemplo, setAction ("foo"). A qué se refiere CommonsWare se aplica solo cuando se obtienen instancias de PendingIntent, si no se ha configurado FLAG_ONE_SHOT. Eso se puede solucionar mediante el argumento requestCode en PendingIntent.get ... métodos de fábrica. Aunque la documentación dice que actualmente no se usa, realmente se tiene en cuenta al distinguir PendingIntents.

En su caso, no necesita configurar nada más que una cadena de acción ficticia. LocationManagerService reutiliza el PendingIntent que ha suscrito para las alertas de proximidad, y solo agrega una marca si el teléfono ha entrado o salido del rango de alarma.

+0

intenté esto y no funcionó. Primero configuré una acción sobre mi intención y luego sobre los extras y luego, creé un intento pendiente que dispara a un receptor de difusión que dispara esto usando un administrador de alarma – jonney

21

Si usted tiene múltiples pendientes PendingIntents, es necesario asegurarse de que el Intents subyacente difieren en más que sus extras. De lo contrario, Android seguirá reutilizando el primer PendingIntent que haya creado para su primer Intent, utilizando los primeros extras de Intent todo el tiempo.

Por ejemplo, puede agregar una acción única vía setAction() - que no va a cambiar su ruta Intent (ya que está especificando el componente), pero que hará que su Intents diferente.

+0

Pude hacer que funcionara también con setAction. En mi caso, creé una cadena única para cada llamada setAction. – drogon

+0

¿Qué hay de PendingIntent.FLAG_ONE_SHOT? Pensé que esto resolvió el problema. – Sotti

+0

@Sotti: 'FLAG_ONE_SHOT' dice que el' PendingIntent' solo se puede ejecutar una vez. Ahora, idealmente, eso * también * significa que un intento de crear un nuevo 'PendingIntent' en un' Intent' equivalente devolvería un 'PendingIntent' distinto ... y podría. Sin embargo, eso no es un comportamiento documentado, por lo que dudo en recomendar 'FLAG_ONE_SHOT'. Ahora, la respuesta aceptada sobre esta pregunta dice que funciona, y ha sido votado un poco, así que tal vez sea seguro. Personalmente, dado el historial de Google, tiendo a ser un poco conservador en casos extremos como este. – CommonsWare

1

La clave es establecer los extras y la acción única de la intención antes de llamar

PendingIntent sender=PendingIntent.getService(this, 0, intent, 0); 

si establece los extras y la acción en el intento después llamar a lo anterior, no lo hará trabajo. Esto hará no trabajo:

Intent intent; 
PendingIntent sender=PendingIntent.getService(this, 0, 
    intent=new Intent(this, PlacesProximityHandlerService.class), 0); 

intent.setAction("PlacesProximityHandlerService"); 
intent.putExtra("lat", objPlace.getLat()); 
+0

. Revise su código. – Richard

7

he tenido este problema y la solución que encontré fue bastante simple, aunque no puedo explicar por qué funcionó.

principio mi intención pendiente era la siguiente:

 notificationIntent = new Intent(ctx, FragmentTabsPager.class); 
    notificationIntent.setData(Uri.parse("content://com.sbs.mobile.workorder.WorkOrder/notes/")); 
    notificationIntent.putExtra("NOTIFICATION", true); 
    notificationIntent.putExtra(WorkOrder.WorkOrderColumns.WORKORDERID, submessage); 

Al crear la intención de este tipo, sería trasladado sin extras cuando se hace clic en la notificación, el mapa extras estaría vacía en la actividad receptora. Realicé el siguiente cambio en la línea inicializando la notificación Intento:

 notificationIntent = new Intent().setClass(ctx, FragmentTabsPager.class); 

Ahora los extras se incluyen en la actividad de recepción. De nuevo, no puedo explicar por qué funciona, pero solucionó mi problema.

+1

Probé esto por desesperación, y sorprendentemente funcionó ... mirando el código, no parece haber ninguna razón por la cual hacerlo de esta manera sería diferente. suspiro. – handler

2

Ninguna de las respuestas funcionó para mí.Establecer acción en una cadena específica funciona por primera vez, pero si utiliza la misma notificación con diferentes extras en un momento posterior, no funcionaría. He sustituido la cadena para el método setAction con una generada aleatoriamente y funciona sin ningún problema:

intent.setAction(new Random().nextInt(50) + "_action"); 
  • Si usted piensa que usted puede utilizar la notificación mucho (como para la descarga de archivos diferentes) A ​​continuación, pasar una número más grande a nextInt()
Cuestiones relacionadas