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 mediante la administración del comportamiento de las apps cuando un dispositivo no está conectado a una fuente de alimentación: Descanso y App Standby. La función Descanso reduce el consumo de batería aplazando la actividad de CPU y 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.

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

Las funciones Descanso y App Standby controlan el comportamiento de todas las apps que se ejecutan en Android 6.0 o versiones posteriores, sin importar si se orientan específicamente al nivel de API 23. Para garantizar la mejor experiencia de los usuarios, prueba tu 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 desconectado, inmóvil durante un período y con la pantalla apagada, este entra en el modo Descanso. En este modo, el sistema intenta ahorrar batería restringiendo el acceso de las apps a servicios de uso intensivo de red y CPU. También evita que las apps accedan a la red y aplaza sus trabajos, sincronizaciones y alarmas estándar.

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 controlen las actividades pendientes.

Cuando finaliza el período de mantenimiento, el sistema vuelve a activar el modo Descanso, lo que suspende el acceso a la red y aplaza tareas, sincronizaciones y alarmas. Con el tiempo, el sistema programa los períodos de mantenimiento con menor frecuencia, lo que ayuda a reducir el consumo de batería en casos de inactividad más prolongada cuando el dispositivo no se está cargando.

Cuando el usuario activa el dispositivo al moverlo, encender la pantalla o conectar 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 manera diferente, según las funciones 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 ayudarte a programar 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 probable que la restricción de acceso a la red aplicada por el modo Descanso también afecte a tu app, en especial si esta 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 comporte como se espera con el modo Descanso, puedes usar los comandos adb para forzar el sistema a entrar y salir de la función, y observar el comportamiento de tu app. Para obtener información detallada, consulta Cómo realizar pruebas con los modos Descanso y App Standby.

Información sobre App Standby

La función App Standby permite que el sistema determine que una app está inactiva cuando el usuario no la usa de forma activa. El sistema hace esta determinación cuando el usuario no toca la app durante un período determinado y no se aplica ninguna de las siguientes condiciones:

  • El usuario inicia explícitamente la app.
  • Actualmente, la app tiene un proceso en primer plano, ya sea como actividad o servicio en primer plano, o en uso por parte de otra actividad o servicio en primer plano.
  • La app genera una notificación que los usuarios ven en la pantalla bloqueada 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 en espera, lo que les permite acceder libremente a la red y ejecutar cualquier tarea y sincronización pendientes. Si el dispositivo queda 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 considerablemente el consumo de batería, ya que evita la necesidad de que varias apps mantengan sus propias conexiones persistentes independientes, lo que puede agotar la batería rápidamente. Por este motivo, si tu app requiere la integración de la mensajería con un servicio de backend, te recomendamos que uses FCM de ser posible, en lugar de mantener tu propia conexión de red persistente.

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

En el caso de los mensajes que no generan notificaciones, como mantener el contenido de la app actualizado en segundo plano o iniciar sincronizaciones de datos, usa los mensajes de FCM con 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 del modo Descanso o tan pronto como 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 use mensajes de prioridad alta solo para los mensajes que generan notificaciones para el usuario.

Compatibilidad con otros casos prácticos

Casi todas las apps son compatibles con el modo Descanso a través de la administración de la conectividad de red, las alarmas, las tareas y las sincronizaciones, y del uso de mensajes de FCM. Para un pequeño conjunto de casos de uso, esto podría 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 conservar 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 para otras. Por ejemplo, las tareas y sincronizaciones de la app se aplazan en el nivel de API 23 y en niveles inferiores, y sus alarmas AlarmManager normales no se activan. Una app puede llamar a isIgnoringBatteryOptimizations() para verificar si está en la lista de exenciones.

Los usuarios pueden configurar manualmente la lista de apps exentas en Configuración > Batería > Optimización de la batería. Como alternativa, el sistema proporciona formas para que las apps soliciten a los usuarios que las eximien:

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

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

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

Cómo probar tu app con el modo Descanso

Para probar el modo Descanso, 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 reactivar el dispositivo:
        $ adb shell dumpsys battery reset
        
  7. Observa el comportamiento de tu app después de reactivar el dispositivo. Asegúrate de que 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 la app se recupere correctamente del modo en espera. En particular, verifica 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 esas situaciones. En general, tu app no cumple con estas excepciones, a menos que los modos Descanso o App Standby interrumpan la función principal de la app o haya un motivo técnico por el que tu app no pueda usar mensajes de prioridad alta de FCM.

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

Tipo Caso de uso ¿Puede usar FCM? ¿Se acepta una exención? Notas
App de mensajería instantánea, chat o llamadas Requiere la entrega de mensajes en tiempo real a los usuarios mientras el dispositivo está en modo Descanso o la app está en modo App Standby. Sí, usa FCM. No Usa 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 puedes usar FCM debido a una dependencia técnica de otro servicio de mensajería o debido a que los modos Descanso y App Standby interrumpen la función principal de la app. Aceptable
App de Seguridad Apps 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 automatizadas, como mensajería instantánea, llamadas de voz o administración de fotos nuevas. Si corresponde: Aceptable
Aplicación complementaria de dispositivo periférico La función principal de la app es mantener una conexión persistente con el dispositivo periférico para proporcionarle acceso a Internet. Si corresponde: Aceptable
La app solo necesita conectarse a un dispositivo periférico de forma periódica para la sincronización o solo debe conectarse a dispositivos, como auriculares inalámbricos, conectados a través de perfiles de Bluetooth estándares. Si corresponde: No