Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Cómo optimizar tu app para Descanso y App Standby

A partir de Android 6.0 (nivel de API 23), Android introduce dos funciones de ahorro de energía que prolongan la duración de la batería mediante el control del comportamiento de las apps cuando un dispositivo no está conectado a una fuente de alimentación. La función 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 con las cuales el usuario no haya interactuado recientemente.

Cuando se activa la función Descanso en un dispositivo, el acceso de las apps a algunos recursos que consumen mucha batería se aplaza hasta los períodos de mantenimiento. Las restricciones específicas se enumeran en Restricciones de administración de energía.

Las funciones 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 del usuario, prueba tu app en ambos modos, y haz cualquier ajuste necesario en tu código. En las siguientes secciones, se proporciona información detallada.

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 las 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: El modo Descanso proporciona una ventana de mantenimiento para que las apps usen la red y realicen las actividades pendientes.

Al finalizar cada período de mantenimiento, el sistema vuelve a activar el modo Descanso, es decir, suspende el acceso a la red aplaza 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 durante períodos de inactividad más largos cuando el dispositivo no está conectado a un cargador.

Ni bien el usuario activa el dispositivo al moverlo, encender la pantalla o conectarlo a un cargador, el sistema desactiva el modo Descanso y todas las apps vuelven a su actividad normal.

Restricciones del modo Descanso

Durante el modo Descanso, se aplican 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 distintas maneras, según las capacidades que ofrezcan y los servicios que usen. Muchas apps funcionan con normalidad durante los ciclos de Descanso sin sufrir modificaciones. En algunos casos, deberás optimizar la manera en que tu app administra la red, las alarmas, las tareas y las sincronizaciones. Las apps deben poder administrar con eficiencia las actividades durante cada período de mantenimiento.

Es muy probable que el modo Descanso afecte las actividades que administran las alarmas y los temporizadores de AlarmManager, ya que las alarmas de Android 5.1 (nivel de API 22) o versiones anteriores no se activan cuando el sistema está en el modo Descanso.

Para ayudar a programar alarmas, Android 6.0 (nivel de API 23) introduce dos nuevos métodos de AlarmManager: setAndAllowWhileIdle() y setExactAndAllowWhileIdle(). Con estos métodos, puedes establecer alarmas que se activan aun cuando el dispositivo esté en modo Descanso.

Nota: Ni setAndAllowWhileIdle() ni setExactAndAllowWhileIdle() pueden activar alarmas más de una vez cada 9 minutos, por app.

Es posible 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, debes usar Firebase Cloud Messaging (FCM), si es posible.

Para confirmar que tu app se comporta como esperas con el modo Descanso, puedes usar los comandos adb a fin de forzar el sistema para que active y desactive el modo Descanso y observar su comportamiento. Para obtener información detallada, consulta Cómo probar tu app con los modos Descanso y App Standby.

Información sobre App Standby

La función App Standby permite al sistema determinar si una app se encuentra inactiva cuando el usuario no la usa activamente. 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).

    Nota: Solo debes usar un servicio en primer plano para tareas que el usuario espera que el sistema ejecute inmediatamente o sin interrupciones. Entre estos casos se incluyen subir una foto a una red social o reproducir música incluso cuando la app del reproductor no está en primer plano. No deberías iniciar un servicio en primero plano solo para evitar que el sistema determine que tu app está inactiva.

  • La app genera una notificación que los usuarios ven en la pantalla bloqueada o en la bandeja de notificaciones.
  • La app es una app de administración del dispositivo activa (por ejemplo, un controlador de política de dispositivo. Si bien, por lo general, se ejecutan en segundo plano, las apps de administración del dispositivo nunca activan el modo App Standby porque deben estar disponibles para recibir política de un servidor en cualquier momento.

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

Cómo usar 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 brinda 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 ampliamente el consumo de batería, ya que elimina la necesidad de que varias apps mantengan su propia conexión independiente y persistente, lo cual 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 trabajar con los modos de inactividad Descanso y App Standby mediante mensajes de FCM de prioridad alta. Estos permiten activar tu app de manera confiable para acceder a la red, incluso si el dispositivo del usuario está en modo Descanso o la app está en modo App Standby. En el modo Descanso o App Standby, el sistema entrega el mensaje, otorga a la app acceso temporario a servicios de red y bloqueos de activación parciales y, luego, restablece el estado inactivo del dispositivo o la app.

Los mensajes de prioridad alta de FCM no afectan de ninguna manera el modo Descanso ni el estado de ninguna otra app, lo que significa que esta puede usarlos para comunicarse de manera eficiente y, al mismo tiempo, minimizar el impacto sobre la batería en el sistema y el dispositivo.

Como práctica recomendada general, si tu app requiere mensajería descendente, debería usar FCM. Si tu servidor y tu cliente ya la usan, asegúrate de que tu servicio use mensajes de alta prioridad para los mensajes críticos, ya que de esta manera, las apps se activarán de forma confiable cuando el dispositivo esté en modo Descanso.

Compatibilidad con otros casos prácticos

Casi todas las apps deberían ser compatibles con el modo Descanso mediante la administración correcta de la conectividad de red, las alarmas, las tareas y las sincronizaciones, y el uso de mensajes de alta prioridad de FCM. Sin embargo, es posible que no sea suficiente para un pequeño grupo de casos prácticos. Para tales casos, el sistema proporciona una lista blanca configurable de apps que están parcialmente exentas de las optimizaciones de Descanso y App Standby.

Una app que está en la lista blanca 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 de la lista blanca, al igual que para otras apps. Por ejemplo, las tareas y sincronizaciones de las apps de la lista blanca 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 se encuentra en la lista blanca de exenciones.

Los usuarios pueden configurar manualmente la lista blanca 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 agreguen a la lista blanca.

Antes de solicitar al usuario que agregue tu app a la lista blanca, asegúrate de que esta coincida con los casos prácticos aceptables para que pueda agregarse a la lista blanca.

Nota: Las políticas de Google Play prohíben que las apps soliciten la exención directa de las funciones de administración de energía en Android 6.0 y versiones posteriores (modos Descanso y App Standby), a menos que la función central de la app se vea afectada negativamente.

Pruebas con los modos Descanso y App Standby

Para garantizar una excelente experiencia del usuario, debes probar 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 con tu app, realiza lo siguiente:

  1. Configura un dispositivo de hardware o virtual con una imagen del sistema de Android 6.0 (nivel de API 23) o posterior.
  2. Conecta el dispositivo a la máquina de desarrollo y luego 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és 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 esta 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, realiza 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 la máquina de desarrollo y luego 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 especial, debes comprobar si las tareas en segundo plano y las notificaciones de tu app continúan funcionando de la manera esperada.

Casos prácticos aceptables para incluir apps en la lista blanca

En la siguiente tabla, se destacan los casos prácticos aceptables para solicitar la inclusión en la lista blanca de exenciones de Optimizaciones de batería o aparecer en ella. En general, tu app no debería estar en la lista blanca, a menos que el modo Descanso o App Standby dañe la función central de la app o haya un motivo técnico por el cual tu app no pueda usar mensajes de prioridad alta de FCM.

Para obtener más información, consulta Compatibilidad con otros casos prácticos.

Tipo Caso práctico ¿Puede usar FCM? ¿Puede incluirse en la lista blanca? 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 modo Descanso o la app está en modo App Standby. Sí, usa FCM. No Debería usar 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 automatización de tareas La función principal de la app es programar tareas automáticas, como la mensajería instantánea, las llamadas de voz, la nueva forma de administración de fotos o las acciones de ubicación. Si corresponde. Aceptable
App complementaria de dispositivo periférico 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 diariamente para la sincronización o solo debe conectarse a dispositivos (como auriculares inalámbricos) mediante perfiles de Bluetooth estándares. Si corresponde. No