Cuando mi aplicación se inicia, quiero que verifique si una alarma particular (registrada a través de AlarmManager) ya está configurada y ejecutándose. Los resultados de google parecen indicar que no hay forma de hacer esto. ¿Esto sigue siendo correcto? Necesito hacer esta verificación para avisar al usuario antes de tomar cualquier medida para crear una nueva alarma.
231
Respuestas:
Siguiendo el comentario que ron publicó, aquí está la solución detallada. Digamos que ha registrado una alarma repetitiva con una intención pendiente como esta:
La forma en que verificaría si está activa es:
La clave aquí es la
FLAG_NO_CREATE
que, como se describe en el javadoc:if the described PendingIntent **does not** already exists, then simply return null
(en lugar de crear una nueva)fuente
alarmManager.cancel(pendingIntent)
ypendingIntent.cancel()
para que esta solución devuelva falso.Para otros que puedan necesitar esto, aquí hay una respuesta.
Utilizar
adb shell dumpsys alarm
Puede saber que la alarma se ha configurado y cuándo van a alarmarse e intervalo. También cuántas veces se ha invocado esta alarma.
fuente
adb shell dumpsys alarm | grep <e.g. package name of your app>
también funciona en los nuevos sistemas Windows (uso Win10)Ejemplo de trabajo con receptor (la respuesta principal fue solo con acción).
Vale la pena mencionar:
En resumen, su PendingIntent debe tener las mismas características (operación y estructura de la intención) para controlarlo.
fuente
Tenga en cuenta esta cita de los documentos para el método establecido de Alarm Manager:
Si sabe que desea configurar la alarma, no necesita molestarse en verificar si ya existe o no. Simplemente créelo cada vez que se inicie su aplicación. Reemplazará cualquier alarma pasada con la misma
Intent
.Necesita un enfoque diferente si está tratando de calcular cuánto tiempo le queda a una alarma creada previamente, o si realmente necesita saber si tal alarma existe. Para responder esas preguntas, considere guardar los datos de preferencias compartidas al momento de crear la alarma. Puede almacenar la marca de tiempo del reloj en el momento en que se activó la alarma, la hora en que espera que suene la alarma y el período de repetición (si configura una alarma que se repite).
fuente
Tengo 2 alarmas Estoy usando la intención con extras en lugar de acción para identificar los eventos:
La cosa es que con los extras extras la intención (y la alarma) no será única. Entonces, para poder identificar qué alarma está activa o no, tuve que definir diff
requestCode
-s:y así es como se creó la alarma:
fuente
PendingIntent.getService
Acabo de encontrar otra solución, parece funcionar para mí
fuente
Mientras que casi todos aquí han dado la respuesta correcta, ningún cuerpo explicó sobre qué base funcionan las alarmas
De hecho, puede obtener más información sobre
AlarmManager
su funcionamiento aquí . Pero aquí está la respuesta rápida.Usted ve
AlarmManager
básicamente horariosPendingIntent
en algún momento en el futuro. Entonces, para cancelar la alarma programada, debe cancelarlaPendingIntent
.Siempre tenga en cuenta dos cosas al crear el
PendingIntent
PendingIntent
Ahora, para verificar si la alarma ya está programada o para cancelarla, solo necesita tener acceso a la misma
PendingIntent
. Esto se puede hacer si usa el mismo código de solicitud y usaFLAG_NO_CREATE
como se muestra a continuaciónCon
FLAG_NO_CREATE
él volveránull
si elPendingIntent
ya no existe. Si ya existe, devuelve referencia a la existentePendingIntent
fuente
Hice un script bash simple (estúpido o no), que extrae los largos del adb shell, los convierte en marcas de tiempo y lo muestra en rojo.
intentalo ;)
fuente
FLAG_NO_CREATE no crea una intención pendiente, por lo que da un valor booleano falso.
Después de que el AlarmManager verifique el valor de Intento pendiente, da verdadero porque AlarmManager actualiza el indicador de intención pendiente.
fuente
Tengo la impresión de que no hay forma de hacer esto, sin embargo, sería bueno.
Puede lograr un resultado similar haciendo que se grabe un Alarm_last_set_time en alguna parte y teniendo un On_boot_starter BroadcastReciever: BOOT_COMPLETED algo así.
fuente