android - programacion - ¿Por qué PendingIntent no devuelve mi configuración personalizada de Extras para Intent?
curso android desarrollo de aplicaciones móviles pdf (5)
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 configura los extras y la acción en el intento 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());
Esta pregunta de alguna manera se relaciona con la pregunta cuando estaba buscando volver a poner los extras en startActivityForResult, pero ahora enfrento otro desafío.
Me he suscrito para recibir ProximityAlerts y he construido explícitamente la intención para incluir algunos extras. Pero cuando recibí 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
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. setAction
la cadena por el método setAction
con uno generado aleatoriamente y funciona sin problemas:
intent.setAction(new Random().nextInt(50) + "_action");
- Si cree que puede usar mucho la notificación (como para descargar archivos diferentes), pase un número más grande a
nextInt()
Por alguna razón no especificada, 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 puede ser resuelto por 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 establecer 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.
Si tiene varios PendingIntents
pendientes, debe asegurarse de que los Intents
subyacentes difieran en más de sus extras. De lo contrario, Android seguirá reutilizando el primer PendingIntent
hayas creado para tu primer Intent
, utilizando los primeros extras de Intent
todo el tiempo.
Por ejemplo, puede agregar una acción única a través de setAction()
, que no cambiará su 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 intento pendiente se veía 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 esta manera, no se pasarán extras cuando se haga clic en la notificación, el mapa de extras estará vacío en la actividad de recepción. Hice el siguiente cambio en la línea inicializando la notificación:
notificationIntent = new Intent().setClass(ctx, FragmentTabsPager.class);
Ahora los extras están ocupados en la actividad de recepción. De nuevo, no puedo explicar por qué funciona, pero solucionó mi problema.