Cómo optimizar tu app para Descanso y App Standby

Android tiene dos funciones de ahorro de energía que extienden la duración de batería de los usuarios, ya que administran el comportamiento de las apps cuando un dispositivo no está conectado a una fuente de alimentación: Descanso y App Standby. Descanso reduce el consumo de batería aplazando la actividad de CPU y de red en segundo plano de las apps cuando el dispositivo no se usa durante períodos prolongados. La función App Standby aplaza la actividad de red en segundo plano de las apps sin actividad reciente del usuario.

Cuando el dispositivo está en Descanso, el acceso de las apps a algunos recursos que consumen mucha batería se aplaza hasta el período de mantenimiento. Las restricciones específicas se enumeran en Restricciones de administración de batería.

Descanso y App Standby controlan el comportamiento de todas las apps que funcionan con Android 6.0 o versiones posteriores, sin importar si se orientan específicamente al nivel de API 23. Para garantizar la mejor experiencia para los usuarios, prueba la app en los modos Descanso y App Standby, y realiza los ajustes necesarios en tu código. En las siguientes secciones, se proporcionan detalles.

Información sobre el modo Descanso

Si un usuario deja un dispositivo inactivo, desconectado y con la pantalla apagada por un período determinado, este entra en el modo Descanso. En este modo, el sistema intenta conservar la carga de la batería restringiendo el acceso de las apps a servicios de uso intenso de CPU y de red. También evita que las apps accedan a la red y aplaza sus tareas, sincronizaciones y alarmas estándares.

De forma periódica, el sistema desactiva el modo Descanso durante un tiempo breve para permitir que las apps completen sus actividades aplazadas. Durante este período de mantenimiento, el sistema ejecuta todas las sincronizaciones, tareas y alarmas pendientes, y permite que las apps accedan a la red.

Figura 1: Descanso proporciona un período de mantenimiento recurrente para que las apps usen la red y manejen actividades pendientes.

Cuando finaliza el período de mantenimiento, el sistema vuelve a activar el modo Descanso, suspender el acceso a la red y aplazar tareas, sincronizaciones y alarmas. Con el paso del tiempo, el sistema programa los períodos de mantenimiento cada vez con menos frecuencia, lo que permite reducir el consumo de batería en casos de inactividad más largos cuando el dispositivo no se está cargando.

Cuando el usuario activa el dispositivo moviéndolo, encendiendo la pantalla o conectándolo a un cargador, el sistema desactiva el modo Descanso y todas las apps reanudan su actividad normal.

Restricciones del modo Descanso

Durante el modo Descanso, el sistema aplica las siguientes restricciones a tus apps:

Lista de comprobación del modo Descanso

Cómo adaptar tu app a Descanso

El modo Descanso puede afectar a las apps de diferentes maneras, según las capacidades que ofrezcan y los servicios que usen. Muchas apps funcionan con normalidad durante los ciclos de Descanso sin modificaciones. En algunos casos, debes optimizar la forma en que tu app administra la red, las alarmas, las tareas y las sincronizaciones. Las apps deben poder administrar de manera eficiente las actividades durante cada período de mantenimiento.

Para ayudar con la programación de alarmas, puedes usar dos métodos AlarmManager: setAndAllowWhileIdle() y setExactAndAllowWhileIdle(). Con estos métodos, puedes establecer alarmas que se activen incluso cuando el dispositivo esté en modo Descanso.

Es posible que la restricción de acceso a la red aplicada por el modo Descanso también afecte a la app, en especial si depende de mensajes en tiempo real, como señales o notificaciones. Si tu app requiere una conexión persistente a la red para recibir mensajes, usa Firebase Cloud Messaging (FCM), si es posible.

Para confirmar que tu app se comporta como se espera con el modo Descanso, puedes usar los comandos adb para forzar al sistema a activar y desactivar el modo Descanso y observar su comportamiento. Para obtener información detallada, consulta Pruebas con los modos Descanso y App Standby.

Información sobre App Standby

Esta función permite que el sistema determine si una app está inactiva cuando el usuario no la usa de forma activa. El sistema lo determina cuando el usuario no toca la pantalla por un período determinado y no se aplica ninguna de las siguientes condiciones:

  • El usuario inicia explícitamente la app.
  • La app actualmente tiene un proceso en primer plano, ya sea como actividad o servicio en primer plano, o bien otra actividad o servicio en primer plano la está usando.
  • La app genera una notificación que los usuarios ven en la pantalla de bloqueo o en la bandeja de notificaciones.

Cuando el usuario enchufa el dispositivo a una fuente de alimentación, el sistema libera las apps del estado de espera, lo que les permite acceder libremente a la red y ejecutar cualquier tarea y sincronización pendientes. Si el dispositivo está inactivo durante períodos prolongados, el sistema permite que las apps inactivas accedan a la red aproximadamente una vez al día.

Usa FCM para interactuar con tu app mientras el dispositivo está inactivo

Firebase Cloud Messaging (FCM) es un servicio de nube a dispositivo que te permite admitir mensajería descendente en tiempo real entre servicios de backend y apps de dispositivos Android. FCM proporciona una conexión única y persistente a la nube. Todas las apps que necesiten mensajería en tiempo real pueden compartir esta conexión. Esta conexión compartida optimiza en gran medida el consumo de batería, ya que elimina la necesidad de que varias apps mantengan su propia conexión independiente y persistente, lo que puede agotar la batería rápidamente. Por este motivo, si tu app requiere integración de mensajería con un servicio de backend, te recomendamos que uses FCM si es posible, en lugar de mantener tu propia conexión de red persistente.

FCM está optimizado para funcionar con los modos inactivos Descanso y App Standby. Los mensajes de prioridad alta de FCM te permiten activar tu app para atraer al usuario. En los modos Descanso o App Standby, el sistema entrega el mensaje y otorga a la app acceso temporal a servicios de red y bloqueos de activación parciales y, luego, restablece el estado inactivo del dispositivo o la app. Para las notificaciones visibles para el usuario y urgentes, considera usar mensajes con prioridad alta para habilitar el envío en el modo Doze. Los mensajes con prioridad alta pueden generar notificaciones. Consulta la orientación de FCM sobre los mensajes de alta prioridad para obtener más información.

Para los mensajes que no generan notificaciones, como mantener el contenido de la app actualizado en segundo plano o iniciar sincronizaciones de datos, usa mensajes de FCM de prioridad normal. Los mensajes con prioridad normal se entregan de inmediato si el dispositivo no está en modo Descanso. Si el dispositivo está en modo Descanso, se entregan durante los períodos de mantenimiento periódicos de Descanso o en cuanto el usuario activa el dispositivo.

Como práctica recomendada general, si tu app requiere mensajería descendente, usa FCM. Si tu app ya usa FCM, asegúrate de que solo use mensajes de prioridad alta para los mensajes que generan notificaciones para el usuario.

Compatibilidad con otros casos prácticos

Casi todas las apps admiten el modo Descanso mediante la administración de la conectividad de red, las alarmas, las tareas y las sincronizaciones, y el uso de mensajes de FCM. Para un conjunto acotado de casos de uso, esto puede no ser suficiente. En estos casos, el sistema proporciona una lista configurable de apps que están parcialmente exentas de las optimizaciones de Descanso y App Standby.

Una app que está parcialmente exenta puede usar la red y mantener los bloqueos de activación parciales durante los modos Descanso y App Standby. Sin embargo, se aplican otras restricciones a la app, al igual que a otras apps. Por ejemplo, las tareas y sincronizaciones de la app se aplazan en el nivel de API 23 y versiones anteriores, y sus alarmas AlarmManager regulares no se activan. Una app puede llamar a isIgnoringBatteryOptimizations() para verificar si se encuentra en la lista de exenciones.

Los usuarios pueden configurar manualmente la lista de apps exentas en Configuración > Batería > Optimización de batería. De manera alternativa, el sistema proporciona métodos para que las apps soliciten a los usuarios que las eximan:

Una app puede llamar a isIgnoringBatteryOptimizations() para verificar si se encuentra en la lista de exenciones.

Cómo realizar pruebas con los modos Descanso y App Standby

Para garantizar una excelente experiencia del usuario, prueba tu app por completo en los modos Descanso y App Standby.

Prueba tu app con el modo Descanso

Para probar el modo Descanso con tu app, haz lo siguiente:

  1. Configura un dispositivo de hardware o virtual con una imagen del sistema de Android 6.0 (nivel de API 23) o versiones posteriores.
  2. Conecta el dispositivo a tu equipo de desarrollo e instala tu app.
  3. Ejecuta tu app y déjala activa.
  4. Ejecuta el siguiente comando para forzar el modo de inactividad en el sistema:
        $ adb shell dumpsys deviceidle force-idle
        
  5. Cuando esté todo listo, ejecuta el siguiente comando para salir del modo de inactividad:
        $ adb shell dumpsys deviceidle unforce
        
  6. Ejecuta el siguiente comando para volver a activar el dispositivo:
        $ adb shell dumpsys battery reset
        
  7. Observa el comportamiento de tu app después de reactivar el dispositivo. Asegúrate de que la app se recupere correctamente cuando el dispositivo salga del modo Descanso.

Cómo probar tu app con App Standby

Para probar el modo App Standby con tu app, haz lo siguiente:

  1. Configura un dispositivo de hardware o virtual con una imagen del sistema de Android 6.0 (nivel de API 23) o versiones posteriores.
  2. Conecta el dispositivo a tu equipo de desarrollo e instala tu app.
  3. Ejecuta tu app y déjala activa.
  4. Ejecuta los siguientes comandos para forzar el modo App Standby en la app:
        $ adb shell dumpsys battery unplug
        $ adb shell am set-inactive <packageName> true
        
  5. Simula la activación de tu app con los siguientes comandos:
        $ adb shell am set-inactive <packageName> false
        $ adb shell am get-inactive <packageName>
        
  6. Observa el comportamiento de tu app después de activarla. Asegúrate de que se reactive correctamente cuando salga del modo App Standby. En particular, comprueba si las notificaciones y los trabajos en segundo plano de tu app funcionan como se espera.

Casos de uso aceptables para la exención

En la siguiente tabla, se destacan varios casos de uso y si es aceptable que las apps usen la acción de intent ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS en estas situaciones. En general, tu app no cumple con estas excepciones, a menos que el modo Descanso o App Standby interrumpa la función principal de la app o haya un motivo técnico por el que tu app no puede usar mensajes de alta prioridad de FCM.

Para obtener más información, consulta Compatibilidad con otros casos de uso.

Tipo Caso de uso ¿Puede usar FCM? ¿Es aceptable la exención? Notas
App de mensajería instantánea, chat o llamadas Requiere el envío de mensajes en tiempo real a los usuarios mientras el dispositivo está en Descanso o la app está en App Standby. Sí, usa FCM. No Usa los mensajes de prioridad alta de FCM para activar la app y acceder a la red.
Sí, pero no usa mensajes de prioridad alta de FCM.
App de mensajería instantánea, chat o llamadas; apps de VoIP empresariales No. No puede usar FCM porque depende técnicamente de otro servicio de mensajería, o bien el modo Descanso o App Standby daña la función central de la app. Aceptable
App de Seguridad. Aplicaciones que protegen a sus usuarios y familias Si corresponde. Aceptable
App de automatización de tareas La función principal de la app es programar acciones automáticas, como mensajería instantánea, llamadas de voz o administración de fotos nuevas. Si corresponde. Aceptable
Aplicación complementaria para dispositivos periféricos. La función principal de la app es mantener una conexión persistente con el dispositivo periférico a fin de proporcionarle acceso a Internet. Si corresponde. Aceptable
La app solo debe conectarse a un dispositivo periférico periódicamente para sincronizarse o solo debe conectarse a dispositivos, como auriculares inalámbricos, conectados a través de perfiles Bluetooth estándar. Si corresponde. No