Demasiadas activaciones

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

AlarmManager se introdujo en las primeras versiones de la plataforma de Android, pero, con el tiempo, muchos casos de uso que anteriormente requerían AlarmManager ahora son más eficaces con funciones más 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() en AlarmManager que incluyan la marca RTC_WAKEUP o ELAPSED_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 string 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.

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.