studio - ¿Cómo compara Android los intentos pendientes?
android studio generar alarma (2)
Supongo que bajo el capó esta bandera usa PendingIntent.equals, pero no estoy realmente segura de qué criterios está usando esa función. ¿Está utilizando la acción, requestCode, categorías, extras (supongo que no), etc.?
En realidad, la pista está en la descripción de la clase:
Una descripción de un Intento y acción objetivo para realizar con él. Las instancias de esta clase se crean con
getActivity (android.content.Context, int, android.content.Intent, int), getActivities (android.content.Context, int, android.content.Intent [], int), getBroadcast (android.content.Context, int, android.content.Intent, int), getService (android.content.Context, int, android.content.Intent, int);
El objeto devuelto se puede entregar a otras aplicaciones para que puedan realizar la acción que describió en su nombre más adelante.
Al otorgar un PendingIntent a otra aplicación, le está otorgando el derecho de realizar la operación que ha especificado como si la otra aplicación fuera usted (con los mismos permisos e identidad). Como tal, debe tener cuidado con la forma en que construye el PendingIntent: casi siempre, por ejemplo, el Intento base que proporciona debe tener el nombre del componente establecido explícitamente en uno de sus propios componentes, para garantizar que finalmente se envíe allí y en ningún otro lugar.
Un PendingIntent en sí mismo es simplemente una referencia a un token mantenido por el sistema que describe los datos originales utilizados para recuperarlo. Esto significa que, incluso si se cancela el proceso de su aplicación propietaria, el propio PendingIntent seguirá siendo utilizable desde otros procesos que se le hayan dado. Si la aplicación creadora recupera posteriormente el mismo tipo de PendingIntent (la misma operación, la misma acción de Intención, datos, categorías y componentes, y los mismos indicadores), recibirá una PendingIntent que representa el mismo token si eso sigue siendo válido, y puede por lo tanto, llame a cancel () para eliminarlo.
Debido a este comportamiento, es importante saber cuándo se considera que dos Intentos son los mismos para los fines de recuperar un PendingIntent. Un error común que cometen las personas es crear múltiples objetos PendingIntent con Intenciones que solo varían en sus contenidos "extra", esperando obtener un PendingIntent diferente cada vez. Esto no sucede. Las partes de la intención que se utilizan para la coincidencia son las mismas definidas por Intent.filterEquals. Si usa dos objetos Intent que son equivalentes según Intent.filterEquals, entonces obtendrá el mismo PendingIntent para ambos.
Hay dos formas típicas de lidiar con esto.
Si realmente necesita múltiples objetos PendingIntent distintos activos al mismo tiempo (por ejemplo, para usarlos como dos notificaciones que se muestran al mismo tiempo), deberá asegurarse de que haya algo diferente en ellos para asociarlos con diferentes. PendingIntents. Estos pueden ser cualquiera de los atributos de Intención considerados por Intent.filterEquals o diferentes enteros de códigos de solicitud suministrados a getActivity (android.content.Context, int, android.content.Intent, int), getActivities (android.content.Context, int, android.content.Intent [], int), getBroadcast (android.content.Context, int, android.content.Intent, int), o getService (android.content.Context, int, android.content.Intent, int).
Si solo necesita un PendingIntent activo a la vez para cualquiera de los Intentos que utilizará, entonces puede usar alternativamente las banderas FLAG_CANCEL_CURRENT o FLAG_UPDATE_CURRENT para cancelar o modificar cualquier PendingIntent actual asociado con el Intent que usted está suministrando.
La documentación para PendingIntent.FLAG_NO_CREATE lee:
Indicador que indica que si el PendingIntent descrito no existe, simplemente devuelva nulo en lugar de crearlo.
Mi pregunta: ¿Qué criterios se utilizan para comparar PendingIntents?
Supongo que bajo el capó esta bandera usa PendingIntent.equals , pero no estoy realmente segura de qué criterios está usando esa función. ¿Está utilizando la acción, requestCode, categorías, extras (supongo que no), etc.?
Contexto:
Quiero iniciar una alarma con una intención pendiente si mi alarma aún no está configurada. Específicamente, estoy siguiendo esta answer .
Intent i = new Intent(applicationContext, MyService.class);
i.setAction("myAction");
PendingIntent pi = PendingIntent.getService(applicationContext, /*requestCode*/0, i, PendingIntent.FLAG_NO_CREATE);
if (pi != null) {
AlarmManager alarmMgr = (AlarmManager)applicationContext.getSystemService(Context.AlarmService);
alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, AlarmManager.INTERVAL_HOUR, AlarmManager.INTERVAL_HOUR, pi);
}
Para determinar si PendingIntent
2 PendingIntent
, lo siguiente debe ser igual:
- El parámetro
PendingIntent
usado cuando se creó elPendingIntent
- La
Intent
ACCIÓN - Las
Intent
CATEGORÍAS - La
Intent
datos - La
Intent
MIMETYPE - El paquete de
Intent
- La
Intent
COMPONENTE
Los extras no son tomados en consideración.
Puede leer más en la documentación del resumen de Intent.filterEquals() y en Intent.filterEquals() .