Manejo del sistema para el usuario en primer y segundo plano

En dispositivos móviles de Android, la compatibilidad con varios usuarios permite que los usuarios ejecuten la en segundo plano (cuando otro usuario está activo) y en primer plano (también conocido como el usuario actual). Para conservar recursos cuando corresponda, el sistema administra el apagado de los usuarios. Siempre se requiere un usuario en primer plano.

A partir de Android 10, Android Automotive tiene una versión configuración que permite que un máximo de tres usuarios solo se ejecuten a la vez (config_multiuserMaxRunningUsers). Por lo tanto, además de la interfaz usuario del sistema (Usuario 0), solo se pueden configurar un usuario en primer plano y uno en segundo plano.

  • En circunstancias normales, el usuario actual se ejecuta en primer plano y el usuario del sistema sin cabeza (usuario 0) se ejecuta en segundo plano. Cuando se mueve un usuario al segundo plano, se detiene, pero no se bloquea. Cuando se alcanza la cantidad máxima de usuarios, se detiene y se bloquea el usuario en segundo plano que se usó menos recientemente (config_multiuserDelayUserDataLocking).
  • Los usuarios en segundo plano detenidos y desbloqueados se reinician durante el modo de garaje.

Los usuarios invitados son efímeros y solo pueden ejecutarse en primer plano. Cuando una persona desactiva el modo de invitado, el usuario invitado se detiene y no puede ejecutarse en segundo plano.

Procesos en segundo plano del usuario

Cuando un usuario pasa del primer plano al segundo plano (y viceversa), todas las actividades y los servicios en primer plano para ese usuario se cancelan. Esto detiene todos los servicios vinculados desde esos servicios. Sin embargo, aún queda algo de limpieza. persistentes y los servicios de apps propias y del sistema del OEM se seguirán ejecutando durante el el usuario (ahora en segundo plano) no se detiene.

Los servicios persistentes son más problemáticos, ya que servicios se encuentran en un bucket de prioridad alta en la memoria insuficiente de Android (OOM) de gestión de proyectos. Aunque las apps para el usuario en primer plano requieran más memoria, esas apps los procesos en segundo plano no se finalizan. Como resultado, desde la vista del usuario en primer plano desde el punto de vista de los servicios persistentes, esa memoria se devuelve solo cuando una persona reinicia el auto, y cualquier se detienen los usuarios.

Estado del usuario

Un usuario se encuentra en un estado detenido (STATE_SHUTDOWN) hasta que se inicia. Si se establece una credencial de usuario (como un PIN), el usuario de Android ejecuta permanecerá bloqueado (STATE_RUNNING_LOCKED) hasta que una persona desbloquee la pantalla de bloqueo para ese usuario. Cuando se desbloquea el usuario, se desencripta su almacenamiento encriptado por credenciales y los directorios de datos de ese usuario están disponibles. En un cambio típico de usuario, el usuario en segundo plano no se detiene y permanece en ejecución y desbloqueado (STATE_RUNNING_UNLOCKED), una vez desbloqueada.

Garage Mode, JobScheduler y actualizaciones de apps para los usuarios

La técnica recomendada para que las apps de Automotive actualicen datos es usar JobScheduler Para programar trabajos para que se ejecuten cuando un dispositivo está inactivo, a través del modo Garaje (por ejemplo, descarga actualizaciones de apps desde Google Play). Después de que las apps registran trabajos con JobScheduler y JobSchedulerService, los trabajos se ejecutan cuando es posible.

CarService envía una señal a JobSchedulerService para activar las tareas configuradas para ejecutarse cuando el dispositivo Automotive está inactivo a través del modo de garaje. Para que JobSchedulerService ejecute trabajos para un usuario en segundo plano, este debe estar en el estado STATE_RUNNING_UNLOCKED. Los trabajos en fila en JobSchedulerService se conservan y sobreviven a los ciclos de energía.

JobScheduler no puede ejecutar trabajos para un usuario específico si este nunca desbloqueado después de un reinicio. Sin embargo, cuando el usuario está desbloqueado y si el usuario permanece en STATE_RUNNING_UNLOCKED, los trabajos para el usuario se pueden ejecutar.