Modo de tareas bloqueadas

En esta guía para desarrolladores, se explica cómo se pueden bloquear los dispositivos de uso específico app o un conjunto de apps. Si eres administrador de movilidad empresarial (EMM) integrador de soluciones o desarrollador, lee esta guía para agregar el modo de tareas bloqueadas a tu de Google Cloud.

Descripción general

Android puede ejecutar tareas con un método de tipo kiosco envolvente que se denomina tarea de bloqueo. automático. Puedes usar el modo de tareas bloqueadas si estás desarrollando una aplicación de kiosco o un selector para presentar una colección de apps. Cuando el sistema se ejecuta en una tarea de bloqueo , los usuarios de dispositivos no suelen ver las notificaciones, acceden a contenido o volver a la pantalla principal (a menos que esté incluida en la lista de entidades permitidas).

Solo se pueden ejecutar las apps incluidas en la lista de entidades permitidas por un controlador de política de dispositivo (DPC) cuando el sistema está en modo de tareas bloqueadas. Las apps se incluyen en la lista de entidades permitidas porque la persona usar el dispositivo no siempre puede salir del modo de tareas bloqueadas.

Cómo se combina la app incluida en la lista de entidades permitidas para el modo de tareas bloqueadas y el DPC de la lista de entidades permitidas dependerá del problema que quieras resolver. Estos son algunos ejemplos:

  • Un único paquete de apps que combina un kiosco (para presentar contenido) y un mini DPC (para incluirla en la lista de entidades permitidas del modo de tareas bloqueadas).
  • Un DPC que forma parte de una solución de administración de movilidad empresarial, lanzando la las apps para dispositivos móviles del cliente en el modo de tareas bloqueadas.

Disponibilidad

En Android 5.0 o versiones posteriores, el sistema puede ejecutarse en modo de tareas bloqueadas. En la tabla 1, se muestra qué versiones de Android admiten apps de lista de entidades permitidas por usuario.

Tabla 1: Compatibilidad de la versión de Android con los modos de administrador de DPC
Versión de Android El DPC administra Notas
Android 5.0 (nivel de API 21) o una versión posterior Dispositivo completamente administrado
Android 8.0 (nivel de API 26) o una versión posterior Usuario secundario afiliado El usuario secundario debe estar afiliado al usuario principal. Consulta descripción general de varios usuarios.
Android 9.0 (nivel de API 28) o una versión posterior Usuario secundario

En Android 9.0 o versiones posteriores, un DPC puede iniciar la actividad de cualquier app en el modo de tareas bloqueadas. En versiones anteriores, la app ya debía admitir el inicio de su propia actividad en modo de tareas bloqueadas.

Agregar apps a la lista de apps permitidas

Un DPC debe incluir apps en la lista de entidades permitidas antes de que se puedan usar en el modo de tareas bloqueadas. Llamada DevicePolicyManager.setLockTaskPackages() a incluir apps en la lista de entidades permitidas para el modo de tareas bloqueadas, como se muestra en el siguiente ejemplo:

Kotlin

// Allowlist two apps.
private val KIOSK_PACKAGE = "com.example.kiosk"
private val PLAYER_PACKAGE = "com.example.player"
private val APP_PACKAGES = arrayOf(KIOSK_PACKAGE, PLAYER_PACKAGE)

// ...

val context = context
val dpm = context.getSystemService(Context.DEVICE_POLICY_SERVICE)
        as DevicePolicyManager
val adminName = getComponentName(context)
dpm.setLockTaskPackages(adminName, APP_PACKAGES)

Java

// Allowlist two apps.
private static final String KIOSK_PACKAGE = "com.example.kiosk";
private static final String PLAYER_PACKAGE = "com.example.player";
private static final String[] APP_PACKAGES = {KIOSK_PACKAGE, PLAYER_PACKAGE};

// ...

Context context = getContext();
DevicePolicyManager dpm =
    (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminName = getComponentName(context);
dpm.setLockTaskPackages(adminName, APP_PACKAGES);

Para descubrir las apps que antes estaban incluidas en la lista de entidades permitidas para el modo de tareas bloqueadas, un DPC puede llamar DevicePolicyManager.getLockTaskPackages() Otra opción las apps pueden llamar DevicePolicyManager.isLockTaskPermitted() para confirmar que un paquete de apps admita el modo de tareas bloqueadas

Iniciar el modo de tareas bloqueadas

En Android 9.0 (nivel de API 28) o versiones posteriores, puedes iniciar la actividad de otra app en modo de tareas bloqueadas. Si una actividad ya se está ejecutando en primer plano o en segundo plano, debes reiniciar la actividad. Llamada ActivityOptions.setLockTaskEnabled() y proporcionar estos cuando inicias la actividad. En el siguiente fragmento, se muestra una forma haz lo siguiente:

Kotlin

// Set an option to turn on lock task mode when starting the activity.
val options = ActivityOptions.makeBasic()
options.setLockTaskEnabled(true)

// Start our kiosk app's main activity with our lock task mode option.
val packageManager = context.packageManager
val launchIntent = packageManager.getLaunchIntentForPackage(KIOSK_PACKAGE)
if (launchIntent != null) {
    context.startActivity(launchIntent, options.toBundle())
}

Java

// Set an option to turn on lock task mode when starting the activity.
ActivityOptions options = ActivityOptions.makeBasic();
options.setLockTaskEnabled(true);

// Start our kiosk app's main activity with our lock task mode option.
PackageManager packageManager = context.getPackageManager();
Intent launchIntent = packageManager.getLaunchIntentForPackage(KIOSK_PACKAGE);
if (launchIntent != null) {
  context.startActivity(launchIntent, options.toBundle());
}

En las versiones de Android anteriores a la 9.0, una app inicia sus propias actividades en una tarea de bloqueo. llamando a Activity.startLockTask(). Cómo llamar a este , esta debe ejecutarse en primer plano (consulta Activity-lifecycle ), por lo que sugerimos llamar al onResume() de un elemento Activity o Fragment. Para llamar a startLockTask(), sigue estos pasos:

Kotlin

// In our Fragment subclass.
override fun onResume() {
    super.onResume()
    // First, confirm that this package is allowlisted to run in lock task mode.
    if (dpm.isLockTaskPermitted(context.packageName)) {
        activity.startLockTask()
    } else {
        // Because the package isn't allowlisted, calling startLockTask() here
        // would put the activity into screen pinning mode.
    }
}

Java

// In our Fragment subclass.
@Override
public void onResume() {
  super.onResume();

  // First, confirm that this package is allowlisted to run in lock task mode.
  if (dpm.isLockTaskPermitted(context.getPackageName())) {
    getActivity().startLockTask();
  } else {
    // Because the package isn't allowlisted, calling startLockTask() here
    // would put the activity into screen pinning mode.
  }
}

No inicies el modo de tareas bloqueadas cuando el dispositivo esté bloqueado porque es posible que el usuario no desbloquear el dispositivo. Puedes llamar a los métodos KeyguardManager para hacer lo siguiente: Averiguar si el dispositivo está bloqueado y usar un ciclo de vida Activity (como onResume() que se llama después del desbloqueo) para iniciar el modo de tareas bloqueadas

Una app en el modo de tareas bloqueadas puede iniciar nuevas actividades siempre que la actividad no inicia una tarea nueva, excepto las que inician una app incluida en la lista de entidades permitidas. Para para entender cómo se relacionan las tareas con las actividades, lee la guía Comprende las tareas y Pila de actividades.

Como alternativa, puedes declarar en el manifiesto de la app archivo cómo debe comportarse una actividad cuando el sistema se ejecuta en modo de tareas bloqueadas. Para que el sistema se ejecute automáticamente tu actividad en el modo de tareas bloqueadas, establece el Atributo android:lockTaskMode a if_whitelisted como como se muestra en el siguiente ejemplo:

<activity
    android:name=".MainActivity"
    android:lockTaskMode="if_whitelisted">
    <!-- ... -->
</activity>

Para obtener más información sobre cómo declarar opciones en el archivo de manifiesto de la app, lee lo siguiente: la referencia lockTaskMode.

Detener el modo de tareas bloqueadas

Un DPC puede detener de forma remota el modo de tareas bloqueadas quitando el paquete de la app del lista de entidades permitidas. Llamada DevicePolicyManager.setLockTaskPackages(), en Android 6.0 (nivel de API 23) o versiones posteriores, y omite el nombre de paquete de la de la lista de entidades permitidas. Cuando actualizas la lista de entidades permitidas, la app regresa a la versión anterior tarea en la pila.

Si una actividad antes llamaba a startLockTask(), la actividad puede llamar Activity.stopLockTask() para detener el modo de tareas bloqueadas Este método solo funciona para la actividad que inició el modo de tareas bloqueadas.

Devoluciones de llamada del ciclo de vida

A tu DPC podría ser útil saber cuándo una app (que se ejecuta en el mismo usuario) ingresa al modo de tareas bloqueadas y sale de él. Para recibir devoluciones de llamada, anula lo siguiente métodos de devolución de llamada en la subclase DeviceAdminReceiver de tu DPC:

onLockTaskModeEntering()
Se llama después de que una app entra en el modo de tareas bloqueadas. Puedes obtener el nombre del paquete de un app a partir del argumento pkg.
onLockTaskModeExiting()
Se invoca después de que una app sale del modo de tareas bloqueadas. Esta devolución de llamada no recibe información adicional sobre la app.

Si inicias otra app en el modo de tareas bloqueadas, debes hacer un seguimiento de la ejecución estado en tu propia app. Cómo comprobar si la app actual se está ejecutando en una tarea de bloqueo usa los métodos de ActivityManager, como se muestra a continuación ejemplo:

Kotlin

// Check if this app is in lock task mode. Screen pinning doesn't count.
var isLockTaskModeRunning = false

val activityManager = context
        .getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    isLockTaskModeRunning =
            activityManager.lockTaskModeState ==
            ActivityManager.LOCK_TASK_MODE_LOCKED
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    // Deprecated in API level 23.
    isLockTaskModeRunning = activityManager.isInLockTaskMode
}

if (isLockTaskModeRunning) {
    // Show the exit button ...
}

Java

// Check if this app is in lock task mode. Screen pinning doesn't count.
boolean isLockTaskModeRunning = false;

ActivityManager activityManager = (ActivityManager)
    getContext().getSystemService(Context.ACTIVITY_SERVICE);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
  isLockTaskModeRunning = activityManager.getLockTaskModeState()
      == ActivityManager.LOCK_TASK_MODE_LOCKED;
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  // Deprecated in API level 23.
  isLockTaskModeRunning = activityManager.isInLockTaskMode();
}

if (isLockTaskModeRunning) {
  // Show the exit button ...
}

Personaliza la IU

Cuando una aplicación se ejecuta en este modo, la interfaz de usuario (IU) del sistema cambia de la siguiente manera:

  • La barra de estado está en blanco, con las notificaciones y la información del sistema ocultas.
  • Los botones Inicio y Recientes están ocultos.
  • Otras apps no podrán iniciar actividades nuevas.
  • La pantalla de bloqueo (si está configurada) está inhabilitada.

En Android 9.0 o versiones posteriores, cuando el modo de tareas bloqueadas está habilitado, tu DPC puede habilitar ciertas funciones de la IU del sistema en el dispositivo, lo cual es útil para que los desarrolladores que creen un de Google. Llamada DevicePolicyManager.setLockTaskFeatures() como se muestra en el siguiente fragmento:

Kotlin

// Enable the Home and Overview buttons so that our custom launcher can respond
// using our custom activities. Implicitly disables all other features.
dpm.setLockTaskFeatures(
        adminName,
        DevicePolicyManager.LOCK_TASK_FEATURE_HOME or
              DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW)

Java

// Enable the Home and Overview buttons so that our custom launcher can respond
// using our custom activities. Implicitly disables all other features.
dpm.setLockTaskFeatures(adminName,
    DevicePolicyManager.LOCK_TASK_FEATURE_HOME |
          DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW);

El sistema inhabilita cualquier función que no incluyas en el argumento flags. El las funciones habilitadas de la IU persisten entre los lanzamientos en el modo de tareas bloqueadas. Si el dispositivo ya está en modo de tareas bloqueadas, los cambios que realices en las funciones de bloqueo de tarea mostrar inmediatamente. En la tabla 2, se describen las funciones de la IU que puedes personalizar.

Tabla 2: Funciones personalizables de la IU del sistema en el modo de tareas bloqueadas
Función de la IU del sistema Descripción
LOCK_TASK_FEATURE_HOME Muestra el botón de la página principal. Habilitar para selectores personalizados: al presionar un botón El botón de inicio no tiene ninguna acción, a menos que incluyas en la lista de entidades permitidas la versión predeterminada de Android de Google.
LOCK_TASK_FEATURE_OVERVIEW Muestra el botón Recientes (al presionar este botón, se abre la Recientes). Si habilitar este botón, también debes habilitar el botón Inicio.
LOCK_TASK_FEATURE_GLOBAL_ACTIONS Habilita el diálogo de acciones globales que se muestra al mantener presionado el botón de encendido. La única función que se habilita cuando setLockTaskFeatures() no se llamó. Por lo general, un usuario no puede apagar el dispositivo si usted inhabilitar este cuadro de diálogo.
LOCK_TASK_FEATURE_NOTIFICATIONS Habilita las notificaciones para todas las apps. Verás los íconos de notificaciones en la barra de estado, las notificaciones de atención y el panel de notificaciones expandible. Si habilitas este botón, también debes habilitar el botón de la página principal. Presionar acciones de notificaciones y botones que abren nuevos paneles, no funcionan con bloqueo el modo de tarea.
LOCK_TASK_FEATURE_SYSTEM_INFO Habilita el área de información del sistema en la barra de estado que contiene indicadores como opciones de conectividad, batería, sonido y vibración.
LOCK_TASK_FEATURE_KEYGUARD Habilita cualquier pantalla de bloqueo que pueda estar configurada en el dispositivo. Normalmente no Adecuado para dispositivos con usuarios públicos, como kioscos de información o la señalización digital.
LOCK_TASK_FEATURE_NONE Inhabilita todas las funciones de IU del sistema mencionadas anteriormente.

Un DPC puede llamar DevicePolicyManager.getLockTaskFeatures() para obtener la lista de funciones disponibles en un dispositivo cuando está habilitado el modo de tareas bloqueadas. Cuándo un dispositivo sale del modo de tareas bloqueadas, la interfaz de usuario vuelve al estado exigido según las políticas de dispositivo existentes.

Bloquear ventanas y superposiciones

Cuando una app se ejecuta en este modo, otras apps y servicios en segundo plano crear nuevas ventanas que Android muestre frente a la app en el modo de tareas bloqueadas Las aplicaciones y los servicios crean estas ventanas para mostrar avisos, diálogos y superposiciones en la persona que usa el dispositivo. Tu DPC puede evitarlos agregando el elemento Restricción de usuario de DISALLOW_CREATE_WINDOWS. El siguiente ejemplo muestra cómo podrías hacer esto en la Devolución de llamada de onLockTaskModeEntering():

Kotlin

// Called just after entering lock task mode.
override fun onLockTaskModeEntering(context: Context, intent: Intent) {
    val dpm = getManager(context)
    val admin = getWho(context)

    dpm.addUserRestriction(admin, UserManager.DISALLOW_CREATE_WINDOWS)
}

Java

// Called just after entering lock task mode.
public void onLockTaskModeEntering(Context context, Intent intent) {
  DevicePolicyManager dpm = getManager(context);
  ComponentName admin = getWho(context);

  dpm.addUserRestriction(admin, UserManager.DISALLOW_CREATE_WINDOWS);
}

Tu DPC puede quitar la restricción de usuario cuando el dispositivo sale del modo de tareas bloqueadas.

Recursos adicionales

Para obtener más información sobre los dispositivos exclusivos, lee los siguientes documentos: