Antecedentes:
Estoy usando PendingIntent para alarmas a través de AlarmManager.
El problema:
Al principio pensé que para cancelar los anteriores, debía proporcionar el requestCode exacto que había usado antes para iniciar la alarma.
Pero luego descubrí que estaba equivocado, como dice la API de cancelación :
Elimina las alarmas con una intención coincidente. Se cancelará cualquier alarma, de cualquier tipo, cuyo Intent coincida con este (según lo definido por filterEquals (Intent)).
mirando " filterEquals ", la documentación dice:
Determine si dos intenciones son iguales a los efectos de la resolución de intenciones (filtrado). Es decir, si su acción, datos, tipo, clase y categorías son los mismos. Esto no compara ningún dato adicional incluido en las intenciones.
así que no entiendo para qué sirve el "requestCode" ...
La pregunta:
¿Para qué se utiliza "requestCode"?
¿Qué sucede si creo varias alarmas con el mismo "requestCode"? ¿Se anulan entre sí?
fuente
If you truly need multiple distinct PendingIntent objects active at the same time (such as to use as two notifications that are both shown at the same time), then you will need to ensure there is something that is different about them to associate them with different PendingIntents. This may be any of the Intent attributes considered by Intent#filterEquals(Intent), or different request code integers supplied.
Respuestas:
requestCode
se usa para recuperar la misma instancia de intención pendiente más adelante (para cancelar, etc.).fuente
Solo quiero agregar a la respuesta de @Minhaj Arfin
1- requestCode se usa para obtener la misma intención pendiente más adelante (para cancelar, etc.)
2- Sí, se anularán siempre que especifique el mismo Receptor para su Intención que especifique en su PendingIntent
ejemplo:
Del ejemplo anterior, no se anularán entre sí porque el receptor es diferente (AlarmReceiverFirst y AlarmReceiverSecond)
Del ejemplo anterior, que se anulan entre sí, ya que el receptor es la misma (AlarmReceiverSecond)
fuente
AlarmReceiverSecond.class
en la intención y luego usaPendingIntent.getService()
. No funcionará, ya queAlarmReceiverSecond.class
es unBroadcastReceiver
, no unService
en mi caso, quiero abrir la misma actividad con dos intenciones diferentes, por lo que si hay dos o más FCMS en la bandeja, cualquiera de ellos solo abrirá y el otro no, así que cambié los códigos de solicitud de intención pendiente y funcionó.
fuente
Una cosa importante
requestCode
que afectará seriamente a su aplicación es el uso de widgets. Los widgets no funcionarán después de reiniciar el teléfono sirequestCode
son iguales. eso significa que elpendingIndent
que establezca en elremoteViews
de su widget debe ser un requestCode único, generalmente el widgetId que acompaña a un número.fuente
En realidad, la documentación establece claramente para qué se utiliza el código de solicitud:
Como parece que todavía no está tan claro, permítanme intentar explicar:
Cuando desea utilizar un
PendingIntent
objeto, no solo crea una instancia de uno. Más bien, se obtiene una del sistema utilizando losPendingIntent
métodos estáticos (getActivity
,getBroadcast
,getService
etc). El sistema mantiene un montón de instancias PendingIntent y le proporciona una. Cuál le da, depende de los parámetros de entrada que pase a estos métodos getter. Esos parámetros de entrada son:,Context
es decir, el receptor de destino de la intención, elIntent
usorequestCode
yflags
. Cuando pasas el mismoContext
, el mismorequestCode
y el mismo intento (es decir, un intento quefilterEquals
con otro intento), obtienes el mismoPendingIntent
objeto. El caso es que el sistema quiere tener la menor cantidad dePendingIntent
objetos posible, por lo que tiende a reutilizar los existentes tanto como sea posible.Por ejemplo, tiene dos notificaciones de calendario, para dos fechas diferentes. Cuando haces clic en uno de ellos, quieres que tu aplicación se abra en la fecha correspondiente de esa notificación. En ese escenario, tiene el mismo
Context
objetivo y elIntent
objeto que está pasando difiere solo en EXTRA_DATA (que especifica la fecha en la que debe estar abierto). Si proporciona lo mismorequestCode
al obtener elPendingIntent
objeto, terminará con el mismoPendingIntent
objeto. Entonces, al crear la segunda notificación, reemplazará elIntent
objeto anterior con el nuevo EXTRA_DATA y terminará con dos notificaciones que apuntan a la misma fecha.Si desea tener dos
PendingIntent
objetos diferentes , como debería en este escenario, debe especificar uno diferenterequestCode
al obtener elPendingIntent
objeto.fuente