Demasiadas activaciones

Las activaciones son un mecanismo en la API de AlarmManager que les permite a los desarrolladores configurar una alarma para activar un dispositivo a una hora especificada. Para configurar una alarma de activación, tu app llama a uno de los métodos set() en AlarmManager con la marca RTC_WAKEUP o ELAPSED_REALTIME_WAKEUP. Cuando se activa dicha alarma, 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. Para obtener información sobre cómo 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. Sin embargo, con el tiempo, muchos casos prácticos que antes requerían AlarmManager ahora se llevan a cabo 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 tu 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. A continuación, se incluyen algunas sugerencias:

  • Busca llamadas a los distintos métodos set() en AlarmManager que incluyen 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 para que puedas identificar con facilidad la ubicación en el origen 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.

Una vez que hayas corregido el problema, verifica que las alarmas de activación funcionen como se esperaba. Para ello, ejecuta 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. Para 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 publicar una notificación o enviarle una alerta). Para obtener una lista de las prácticas recomendadas de AlarmManager, consulta Cómo programar la repetición de alarmas.

No uses AlarmManager para programar tareas en segundo plano, en especial tareas en segundo plano de red o repetitivas. 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 tiempo que sean válidas solo mientras la app se está ejecutando (es decir, la operación de tiempo debe cancelarse cuando el usuario sale de la app). En estos casos, utiliza la clase Handler, que es más fácil de usar y es mucho más eficiente.