Android 9 (nivel de API 28) y versiones posteriores admiten buckets de App Standby. Esta función ayuda al sistema a priorizar las solicitudes de recursos que hacen las apps según el momento en que se usan y la frecuencia de uso. En función de los patrones de uso, se coloca cada una de las apps en uno de los cinco buckets de prioridad. El sistema limita los recursos del dispositivo que están disponibles para cada app según el bucket en el que estas se encuentran.
Buckets de prioridad
El sistema asigna de forma dinámica cada app a un bucket de prioridad y reasigna las apps según sea necesario. Por otra parte, el sistema puede depender de una app precargada que utiliza el aprendizaje automático para determinar la probabilidad de uso de cada app y asigna las apps a los buckets apropiados.
Si no está la app del sistema en el dispositivo, el sistema establece de forma predeterminada el orden de las apps en función de su uso reciente. Las apps que están más activas se asignan a los buckets que les dan mayor prioridad, lo que hace que haya más recursos del sistema disponibles para la app. En particular, el bucket determina la frecuencia con la que se ejecutan los trabajos de la app y aquella con la que la app puede activar alarmas. Estas restricciones se aplican solo mientras el dispositivo funciona con batería. Mientras el dispositivo se está cargando, el sistema no impone estas restricciones.
Los buckets de prioridad son los siguientes:
- Activo: La app se está usando o se usó muy poco tiempo atrás.
- Conjunto de tareas: Se está haciendo un uso habitual de la app.
- Frecuente: La app se usa con frecuencia, pero no a diario.
- Poco frecuente: La app no se usa con frecuencia.
- Restringido: La app consume muchos recursos del sistema o puede mostrar un comportamiento no deseado.
Además de estos buckets de prioridad, hay un bucket nunca especial para apps que se instalaron, pero nunca se ejecutaron. El sistema impone restricciones severas a estas apps.
Las siguientes descripciones corresponden al caso no predictivo. Por el contrario, cuando se utiliza el aprendizaje automático para predecir el comportamiento, se eligen los buckets antes de las próximas acciones del usuario, y no en función del uso reciente. Por ejemplo, una app que se usó recientemente puede terminar en un bucket poco frecuente porque el aprendizaje automático predice que no se usará durante varias horas.
Activo
Una app está en el bucket activo mientras se usa o se usó muy poco tiempo atrás, o cuando realiza alguna de las siguientes acciones:
- Inicia una actividad.
- Ejecuta un servicio en primer plano de larga duración.
- El usuario lo presiona desde una notificación.
Si una app está en el bucket activo, el sistema no impone restricciones a sus trabajos ni alarmas.
La interacción del usuario asigna las apps como activas
En Android 9 (nivel de API 28) y versiones posteriores, cuando el usuario interactúa con tu app de ciertas maneras, el sistema la ubica temporalmente en el bucket activo. Después de que el usuario deja de interactuar con tu app, el sistema la ubica en un bucket según el historial de uso.
Los siguientes son ejemplos de interacciones que activan este comportamiento del sistema:
El usuario presiona una notificación que envía la app.
El usuario interactúa con un servicio en primer plano en tu app presionando un botón multimedia.
El usuario se conecta a tu app mientras interactúa con el SO Android Automotive, en el que tu app usa un servicio en primer plano o
CONNECTION_TYPE_PROJECTION
.
Conjunto de tareas
Una app está en el bucket conjunto de tareas si se ejecuta con frecuencia, pero no está activa. Por ejemplo, es probable que una app de redes sociales que el usuario inicia casi todos los días esté en este bucket. Las apps también se incluyen en el conjunto de tareas si se usan de manera indirecta.
Si una app está en el conjunto de tareas, el sistema impone restricciones leves en cuanto a su capacidad para ejecutar trabajos y activar alarmas. Para obtener más información, consulta Restricciones para la administración de batería.
Frecuente
Una app está en el bucket frecuente si se usa con frecuencia, pero no necesariamente todos los días. Por ejemplo, se podría incluir en el bucket frecuente una app de seguimiento de entrenamiento que el usuario ejecuta en el gimnasio.
Si una app se encuentra en el bucket frecuente, el sistema impone restricciones más fuertes en cuanto a su capacidad para ejecutar trabajos y activar alarmas. Para obtener más información, consulta Restricciones para la administración de batería.
Poco frecuente
Una app está en el bucket poco frecuente si no se usa con frecuencia. Por ejemplo, una app de hotel que el usuario solo ejecuta mientras permanece en él podría estar en este bucket.
Si una app se encuentra en el bucket poco frecuente, el sistema impone restricciones estrictas en cuanto a su capacidad para ejecutar trabajos y activar alarmas. Además, el sistema limita la capacidad de la app de conectarse a Internet. Para obtener más información, consulta Restricciones para la administración de batería.
Restringido
Este bucket, que se agregó en Android 12 (nivel de API 31), tiene la prioridad más baja y las restricciones más altas de todos. El sistema considera el comportamiento de tu app, como la frecuencia con la que el usuario interactúa con ella, para decidir si colocará tu app en el bucket restringido.
En Android 13 (nivel de API 33) y versiones posteriores, a menos que tu app cumpla con los requisitos para una exención, el sistema colocará la app en el bucket restringido en las siguientes situaciones:
El usuario no interactúa con tu app durante una cantidad específica de días. En Android 12 (nivel de API 31) y 12L (nivel de API 32), la cantidad de días es de 45. Android 13 reduce la cantidad de días a 8.
Tu app invoca una cantidad excesiva de transmisiones o vinculaciones durante un período de 24 horas.
Si el sistema coloca la app en el bucket restringido, se aplican las siguientes restricciones:
- Puedes ejecutar trabajos una vez al día, en una sesión por lotes de 10 minutos. Durante esta sesión, el sistema agrupa los trabajos de la app con los trabajos de otras.
- Los trabajos restringidos no se ejecutan por sí mismos. Debe haber al menos otro trabajo en ejecución o pendiente al mismo tiempo, lo que puede incluir cualquier otro trabajo.
- La app puede ejecutar menos trabajos acelerados, en comparación con el momento en el que el sistema la coloca en un bucket menos restringido.
- Tu app puede invocar una alarma por día, que puede ser una alarma exacta o una alarma inexacta.
Exenciones del bucket restringido
Los siguientes tipos de apps están exentos de ingresar al bucket restringido y omitir el activador de inactividad, incluso en Android 12 y versiones posteriores:
- Apps de dispositivos complementarios
- Apps que se ejecuten en un dispositivo en modo de demostración
- Apps del propietario del dispositivo
- Apps del propietario del perfil
- Apps persistentes
- Apps de VPN
- Apps que tienen el rol
ROLE_DIALER
- Apps que el usuario designó de forma explícita para que brinden la funcionalidad "sin restricciones" en la configuración del sistema
- Apps con widgets activos
- Apps que tienen al menos uno de los siguientes permisos:
Cómo evaluar el bucket de prioridad
Para comprobar a qué bucket se asignó tu app, haz lo siguiente:
Llama a
getAppStandbyBucket()
.Ejecuta el siguiente comando en una ventana de terminal:
adb shell am get-standby-bucket PACKAGE_NAME
El sistema limita la app cada vez que se coloca en un bucket de App Standby cuyo valor es mayor que STANDBY_BUCKET_ACTIVE
(10).
Prácticas recomendadas
Si tu app sigue las prácticas recomendadas para Descanso y App Standby, las funciones de administración de batería posteriores no resultan difíciles. Sin embargo, el comportamiento de algunas apps que antes funcionaban bien podría causar problemas.
- No intentes manipular el sistema para que ubique tu app en un bucket determinado. El método de prioridad del sistema puede cambiar, y cada fabricante de dispositivos puede optar por escribir su app de agrupamiento con un algoritmo propio. En cambio, debes asegurarte de que tu app se comporte de manera correcta, sin importar en qué bucket se encuentre.
- Si una app no tiene una actividad de selector, es posible que nunca se incluya en el bucket activo. Considera rediseñar tu app para que incluya esta actividad.
Si los usuarios no pueden interactuar con las notificaciones de la app, no podrán activar su inclusión en el bucket activo. En este caso, considera rediseñar algunas notificaciones que permitan la interacción de los usuarios. Para ver algunos lineamientos, consulta los patrones de diseño de las notificaciones de Material Design.
Si la app no muestra una notificación cuando recibe un mensaje de Firebase Cloud Messaging (FCM) de alta prioridad, el usuario no puede interactuar con ella y, así, incluirla en el bucket activo. De hecho, el único uso previsto para los mensajes de FCM de alta prioridad es enviar una notificación al usuario, por lo que esta situación no debe ocurrir. En la versión 12L (nivel de API 32) y versiones anteriores, si marcas de forma inapropiada un mensaje de FCM como de prioridad alta cuando no activa la interacción del usuario, es posible que se anulen las prioridades en los mensajes futuros.
Si se dividen las apps en varios paquetes, estos pueden estar en diferentes buckets y, por lo tanto, tener diferentes niveles de acceso. Prueba estas apps con los paquetes asignados a varios buckets para asegurarte de que la app se comporte correctamente.