Las activaciones son un mecanismo de la API de AlarmManager
que permite a los desarrolladores establecer una alarma para activar un dispositivo en un momento determinado. Tu app establece una alarma de activación llamando a uno de los métodos set()
en AlarmManager
con la marca RTC_WAKEUP
o ELAPSED_REALTIME_WAKEUP
. Cuando se activa una de estas alarmas, el dispositivo sale del modo de bajo consumo y mantiene un bloqueo de activación parcial mientras ejecuta el método onReceive()
o onAlarm()
de la alarma. Si se activan demasiadas de estas alarmas, se puede agotar la batería de un dispositivo.
Para mejorar la calidad de tu app, Android la supervisa automáticamente en busca de alarmas de activación excesivas y muestra la información en Android vitals. Si deseas obtener información sobre la forma en que se recopilan estos datos, consulta la documentación de Play Console.
Si tu app activa el dispositivo de forma excesiva, puedes seguir las indicaciones que se incluyen en esta página para diagnosticar el problema y corregirlo.
Cómo corregir el problema
La AlarmManager
fue
se introdujo en las primeras versiones de la plataforma de Android, pero, con el tiempo, muchos usan
casos que anteriormente requerían
AlarmManager
ahora son
funciona mejor con funciones nuevas, como
WorkManager
En esta sección, se incluyen sugerencias para reducir las alarmas de activación. No obstante, a largo plazo, analiza la posibilidad de migrar la app de acuerdo con las recomendaciones incluidas en la sección de prácticas recomendadas.
Identifica dónde se programan las alarmas de activación en tu app y reduce la frecuencia con la que se activan. Aquí encontrarás algunas sugerencias:
Busca llamadas a varios métodos
set()
enAlarmManager
que incluyan la marcaRTC_WAKEUP
oELAPSED_REALTIME_WAKEUP
.Incluye el nombre de tu paquete, clase o método en el nombre de la etiqueta de tu alarma de modo que puedas identificar con facilidad la ubicación en la fuente donde se configuró la alarma. Estas son otras sugerencias:
- No incluyas información de identificación personal (PII) en el nombre, como una dirección de correo electrónico. De lo contrario, el dispositivo registrará
_UNKNOWN
, en lugar del nombre de la alarma. - No obtengas el nombre de la clase o del método de forma programática, por ejemplo, llamando a
getName()
, ya que ProGuard podría ofuscarlo. En su lugar, usa una cadena hard-coded. - No agregues un contador ni identificadores únicos a las etiquetas de la alarma. El sistema no podrá agrupar alarmas configuradas de esa manera, ya que todas tendrán identificadores únicos.
- No incluyas información de identificación personal (PII) en el nombre, como una dirección de correo electrónico. De lo contrario, el dispositivo registrará
Después de solucionar el problema, verifica que las alarmas de activación funcionen según lo esperado, ejecutando el siguiente comando de ADB:
adb shell dumpsys alarm
Este comando proporciona información sobre el estado del servicio del sistema de la alarma en el dispositivo. Si deseas obtener más información, consulta dumpsys.
Prácticas recomendadas
Usa las alarmas de activación solo si tu app debe realizar una operación para el usuario (como enviarle una alerta o publicar una notificación). Si deseas obtener una lista de las prácticas recomendadas de AlarmManager, consulta Cómo programar alarmas.
No uses AlarmManager
para programar tareas en segundo plano, especialmente tareas periódicas o de red. Usa WorkManager para programar tareas en segundo plano, ya que ofrece los siguientes beneficios:
- Agrupación en lotes: Los trabajos se combinan para reducir el consumo de batería.
- Persistencia: Si se reinicia el dispositivo, los trabajos programados de WorkManager se ejecutan al finalizar el reinicio.
- Criterios: Los trabajos se pueden ejecutar según condiciones, por ejemplo, si se está cargando el dispositivo o si hay una conexión Wi-Fi disponible.
Si deseas obtener más información, consulta la Guía para el procesamiento en segundo plano.
No uses AlarmManager
para programar operaciones de sincronización válidas solo mientras la app está en ejecución (en otras palabras, la operación de sincronización debe cancelarse cuando el usuario sale de la app). En esas situaciones, usa la clase Handler
, ya que es más fácil de usar y mucho más eficiente.
Recomendaciones para ti
- Nota: El texto del vínculo se muestra cuando JavaScript está desactivado
- Bloqueos de activación sostenidos parciales
- ANRs