¿Por qué PendingIntent no envía de nuevo mi configuración de extras personalizada para el intento?

Estas preguntas se relacionan de alguna manera con la pregunta cuando estaba buscando obtener los extras de nuevo en startActivityForResult pero ahora me enfrento a otro desafío.

Me he suscrito a recibir ProximityAlerts y he construido explícitamente el intento de incluir algunos extras. Pero cuando me dieron el servicio los extras no están allí.

Después de las respuestas aquí está 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 param PendingIntent to be sent for each location update

Por alguna razón no especificada, los extras serán entregados sólo si has establecido alguna acción, por ejemplo setAction ("foo"). Lo que se refiere a CommonsWare sólo se aplica cuando se obtienen instancias de PendingIntent, si no se ha establecido FLAG_ONE_SHOT. Eso puede ser fijado por el argumento requestCode en PendingIntent.get … métodos de fábrica. Aunque la documentación dice que actualmente no se utiliza, realmente toma en cuenta al distinguir PendingIntents.

En su caso, no es necesario establecer nada más que alguna cadena de acción ficticia. LocationManagerService reutiliza el PendingIntent que ha suscrito para alertas de proximidad y sólo agrega un indicador si el teléfono ha entrado o salido del rango de alarma.

Si tiene varios pendientes PendingIntents , debe asegurarse de que los Intents subyacentes difieren en más de sus extras. De lo contrario, Android mantendrá reutilizando el primer PendingIntent que creó para su primer Intent , utilizando los extras del primer Intent todo el tiempo.

Por ejemplo, puede agregar una acción única a través de setAction() , que no cambiará el enrutamiento de Intent (ya que está especificando el componente), pero hará que sus Intents diferentes.

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

Inicialmente mi intención pendiente era así:

  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 modo, no se pasan extras cuando se hace clic en la notificación, el mapa de extras estará vacío en la actividad de recepción. Hice el cambio siguiente a la línea que inicializa el notificationIntent:

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

Ahora los extras se pueblan en la actividad de recepción. Una vez más, no puedo explicar por qué esto funciona, pero arregló mi problema.

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

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

Si establece los extras y la acción en la intención después de llamar a lo anterior, no funcionará. Esto no funcionará:

 Intent intent; PendingIntent sender=PendingIntent.getService(this, 0, intent=new Intent(this, PlacesProximityHandlerService.class), 0); intent.setAction("PlacesProximityHandlerService"); intent.putExtra("lat", objPlace.getLat()); 

Ninguna de las respuestas funcionó para mí. El ajuste de la acción a 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 reemplazado la cadena por el método setAction con una generada aleatoriamente y funciona sin ningún problema:

 intent.setAction(new Random().nextInt(50) + "_action"); 
  • Si piensa que puede usar la notificación mucho (como para descargar archivos diferentes), pase un número mayor a nextInt()
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.