Quiero implementar una función de programación en mi proyecto. Así que busqué en Google un programa de administrador de alarmas pero no puedo encontrar ningún ejemplo.
¿Alguien puede ayudarme con un programa básico de gestión de alarmas?
java
android
kotlin
alarmmanager
Rajamohan Sugumaran
fuente
fuente
Respuestas:
Este es el código de trabajo. Despierta la CPU cada 10 minutos hasta que el teléfono se apaga.
Añadir a Manifest.xml:
Código en tu clase:
Establecer alarma de servicio:
Si desea configurar la alarma que se repite en el momento del arranque del teléfono:
Agregue permiso y el servicio a Manifest.xml:
Y crea una nueva clase:
fuente
am.setInexactRepeating(...)
para que el teléfono no se despierte innecesariamente debido al servicio. Otros programadores deben tomar nota de este hecho. 2. En lugar de crear una nuevaAlarm
enAutoStart
vez recibida laRECEIVE_BOOT_COMPLETED
intención, podría tener más sentido comenzarYourService
a partirAutoStart
, como se muestra aquí: stackoverflow.com/a/5439320/198348WakefulBroadcastReceiver
destituido deAndroid O
Probé la solución de XXX y aunque inicialmente funcionó, en algún momento dejó de funcionar. El
onReceive
nunca nos llama de nuevo. Pasé horas tratando de descubrir qué podría ser. De lo que me di cuenta es que yaIntent
por alguna razón misteriosa ya no se llamaba. Para evitar esto, descubrí que realmente necesitas especificar una acción para el receptor en el manifiesto. Ejemplo:Tenga en cuenta que el nombre es
".Alarm"
con el punto. En elsetAlarm
método de XXX , cree loIntent
siguiente:El
START_ALARM
mensaje puede ser lo que quieras que sea. Solo le di ese nombre con fines de demostración.No he visto receptores definidos en el manifiesto sin un filtro de intención que especifique la acción. Creándolos de la manera en que XXX ha especificado, parece un poco falso. Al especificar el nombre de la acción, Android se verá obligado a crear una instancia del
BroadcastReceiver
uso de la clase que corresponde a la acción. Si confía en el contexto, tenga en cuenta que Android tiene varios objetos diferentes que TODOS se denominan contexto y pueden no resultar en suBroadcastReceiver
creación. Obligar a Android a crear una instancia de su clase usando solo el mensaje de acción es mucho mejor que confiar en algún contexto dudoso que puede que nunca funcione.fuente
PendingIntent.getBroadcast
la documentación,For security reasons, the Intent you supply here should almost always be an explicit intent, that is specify an explicit component to be delivered to through Intent.setClass
.android:exported="true"
necesario para que funcione?Aquí hay un ejemplo bastante autónomo. Se vuelve rojo un botón después de 5 segundos.
Sin embargo, recuerde que el AlarmManager se activa incluso cuando su aplicación no se está ejecutando. Si llama a esta función y presiona el botón Inicio, espere 5 segundos, luego vuelva a su aplicación, el botón se habrá puesto rojo.
No sé qué tipo de comportamiento obtendría si su aplicación no está en la memoria, así que tenga cuidado con el tipo de estado que intenta preservar.
fuente
RTC_WAKEUP
lugar deELAPSED_REALTIME_WAKEUP
) no parece activar el receptor en una aplicación que aparentemente ha sido descargada por el sistema para ahorrar energía, aunque funciona poco después de que la pantalla de inicio se haya puesto en primer plano.MainActivity.java
MyBroadcastReceiver.java
AndroidManifest.xml
fuente
•
AlarmManager
en combinación conIntentService
Creo que el mejor patrón para usar
AlarmManager
es su colaboración con unIntentService
. ElIntentService
es activado porAlarmManager
y maneja las acciones requeridas a través de la intención de recepción. Esta estructura no tiene impacto en el rendimiento como usarBroadcastReceiver
. He desarrollado un código de muestra para esta idea enKotlin que está disponible aquí:MyAlarmManager.kt
MyIntentService.kt
manifest.xml
Uso:
Si desea cancelar la alarma programada, intente esto:
fuente
Este código lo ayudará a hacer una alarma repetitiva. El tiempo de repetición puede establecer por usted.
activity_main.xml
MainActivity.java
Si necesita alarma solo por una vez, reemplace
con
fuente
Hice mi propia implementación para hacer esto de la manera más simple posible.
El único siguiente paso, implementarlo.
Me gusta trabajar con esta implementación, pero otra buena manera posible es no hacer que la
AbstractSystemServiceTask
clase sea abstracta y construirla a través de un generador.Espero que te ayude.
ACTUALIZADO Mejorado para permitir varios
BackgroundTaskListener
en el mismoBroadCastReceiver
.fuente
Administrador de alarmas:
Agregar al diseño XML (* init estas vistas al crear en la actividad principal)
Agregar al manifiesto (etiqueta de aplicación interna y actividad externa)
Crear clase AlarmBroadcastManager (heredarla de BroadcastReceiver)
En Actividad principal (Agregar estas funciones):
fuente
Aquí hay un ejemplo con Alarm Manager usando Kotlin:
fuente