Modo de bloqueio de tarefas

Este guia do desenvolvedor explica como os dispositivos dedicados podem ser bloqueados a um único ou um conjunto de apps. Se você é gerente de mobilidade empresarial (EMM) desenvolvedor ou integrador de soluções, leia este guia para adicionar o modo de bloqueio de tarefas à sua solução.

Visão geral

O Android pode executar tarefas de maneira imersiva, semelhante à forma de quiosque, com o recurso de bloqueio de tarefas". . Use o modo de bloqueio de tarefas se estiver desenvolvendo um aplicativo de quiosque ou uma tela de início para apresentar uma coleção de apps. Quando o sistema é executado na tarefa de bloqueio os usuários do dispositivo normalmente não veem notificações, acessam itens que não estão na lista de permissões ou voltar para a tela inicial (a menos que ela esteja na lista de permissões).

Somente apps na lista de permissões de um controlador de política de dispositivo (DPC) podem ser executados quando o sistema está no modo de bloqueio de tarefas. Os apps são incluídos na lista de permissões porque a pessoa que usam o dispositivo nem sempre podem sair do modo de bloqueio de tarefas.

Como combinar o app na lista de permissões para o modo de bloqueio de tarefas e o DPC da lista de permissões vai depender do problema que você quer resolver. Veja alguns exemplos:

  • Um único pacote de app que combina um quiosque (para apresentar conteúdo) e um mini DPC para permitir o modo de bloqueio de atividade.
  • Um DPC que faz parte de uma solução de gerenciamento de mobilidade empresarial, lançando o aplicativos para dispositivos móveis do cliente no modo de bloqueio de tarefas.

Disponibilidade

O sistema pode ser executado no modo de bloqueio de tarefas no Android 5.0 ou mais recente. A Tabela 1 mostra quais versões do Android oferecem suporte à lista de permissões de apps por usuário.

:
Tabela 1. Suporte à versão do Android para os modos de administrador de DPC
Versão do Android Administração pelo DPC Observações
Android 5.0 (nível 21 da API) ou mais recente Dispositivo totalmente gerenciado
Android 8.0 (nível 26 da API) ou mais recente Usuário secundário afiliado O usuário secundário precisa ser afiliado ao usuário principal. Consulte visão geral de vários usuários.
Android 9.0 (nível 28 da API) ou mais recente Usuário secundário

No Android 9.0 ou mais recente, um DPC pode iniciar a atividade de qualquer app no modo de bloqueio de tarefas. Em versões anteriores, o aplicativo já precisaria oferecer suporte ao início da própria atividade em modo de bloqueio de atividade.

Colocar apps na lista de permissões

Um DPC precisa colocar apps na lista de permissões antes que eles possam ser usados no modo de bloqueio de tarefas. Ligação DevicePolicyManager.setLockTaskPackages() para colocar apps na lista de permissões para o modo de bloqueio de atividade, conforme mostrado no exemplo a seguir:

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 descobrir os apps que estavam na lista de permissões anteriormente para o modo de bloqueio de atividade, um DPC pode chamar DevicePolicyManager.getLockTaskPackages() Outra opção Os apps podem ligar DevicePolicyManager.isLockTaskPermitted() para confirmar que um pacote de app oferece suporte ao modo de bloqueio de tarefas.

Iniciar modo de bloqueio de tarefas

No Android 9.0 (nível 28 da API) ou versões mais recentes, é possível iniciar a atividade de outro app modo de bloqueio de atividade. Se uma atividade já estiver em execução em primeiro plano ou segundo plano, será necessário reiniciar a atividade. Ligação ActivityOptions.setLockTaskEnabled() e forneça estas ao iniciar a atividade. O snippet a seguir mostra uma maneira de faça isto:

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());
}

Nas versões do Android anteriores à 9.0, um app inicia as próprias atividades na tarefa de bloqueio chamando Activity.startLockTask(). Para chamar isso a atividade precisa estar em execução em primeiro plano. Consulte Activity-lifecycle, conceitos), por isso, sugerimos chamar no campo Método onResume() de um Activity ou Fragment. Veja como chamar startLockTask():

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.
  }
}

Não iniciar o modo de bloqueio de tarefas quando o dispositivo estiver bloqueado, porque o usuário pode não iniciar consigam desbloquear o dispositivo. Você pode chamar métodos KeyguardManager para descobrir se o dispositivo está bloqueado e usar um ciclo de vida da Activity; (como onResume(), que é chamado após o desbloqueio) para iniciar o modo de bloqueio de tarefas.

Um app no modo de bloqueio de tarefas pode iniciar novas atividades, desde que não inicia uma nova tarefa, exceto as que iniciam um app permitido. Para entender como as tarefas se relacionam com as atividades, leia o guia Entender tarefas e backstack.

Como alternativa, declare no manifesto do aplicativo arquivo de como uma atividade deve se comportar ao o sistema está sendo executado no modo de bloqueio de tarefas. Para que o sistema seja executado automaticamente sua atividade no modo de bloqueio de tarefas, android:lockTaskMode para if_whitelisted como como mostrado no exemplo a seguir:

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

Para saber mais sobre como declarar opções no arquivo de manifesto do aplicativo, leia referência lockTaskMode.

Parar modo de bloqueio de tarefas

Um DPC pode interromper remotamente o modo de bloqueio de tarefas removendo o pacote de app da na lista de permissões. Ligação DevicePolicyManager.setLockTaskPackages(), em Android 6.0 (API de nível 23) ou posterior e omitir o nome do pacote do matriz da lista de permissões. Quando você atualiza a lista de permissões, o app retorna para a versão anterior tarefa na pilha.

Se uma atividade anteriormente chamava startLockTask(), ela pode chamar Activity.stopLockTask() para interromper o modo de bloqueio de tarefas. Esse método só funciona para a atividade que iniciou o modo de bloqueio de tarefas.

Callbacks do ciclo de vida

Pode ser útil para seu DPC saber quando um app (executado no mesmo usuário) entra e sai do modo de bloqueio de tarefas. Para receber callbacks, modifique o seguinte callback na subclasse DeviceAdminReceiver do DPC:

onLockTaskModeEntering()
Chamada depois que um app entra no modo de bloqueio de tarefas. Você pode obter o nome do pacote de um do argumento pkg.
onLockTaskModeExiting()
Chamada depois que um app sai do modo de bloqueio de tarefas. Este callback não recebe informações sobre o app.

Se você iniciar outro app no modo de bloqueio de tarefas, precisará rastrear a execução status no seu próprio app. Para verificar se o app atual está sendo executado na tarefa de bloqueio use os métodos em ActivityManager, conforme mostrado abaixo exemplo:

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 ...
}

Personalizar a UI

Quando um aplicativo é executado no modo de bloqueio de tarefas, a interface de usuário (IU) do sistema muda em das seguintes maneiras:

  • A barra de status está em branco, com notificações e informações do sistema ocultas.
  • Os botões "Página inicial" e "Visão geral" estão ocultos.
  • Outros apps não podem iniciar novas atividades.
  • A tela de bloqueio (se definida) está desativada.

No Android 9.0 ou versões mais recentes, quando o modo de bloqueio de tarefas está ativado, o DPC pode ativar determinados recursos de interface do sistema no dispositivo, úteis para os desenvolvedores que criam acesso rápido. Ligação DevicePolicyManager.setLockTaskFeatures(), conforme mostrado no seguinte snippet:

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);

O sistema desativa todos os recursos não incluídos no argumento flags. A os recursos de interface ativados permanecem entre as inicializações no modo de bloqueio de tarefas. Se o dispositivo já está no modo de bloqueio de tarefas, todas as alterações feitas nesses recursos serão exibidos imediatamente. A Tabela 2 descreve os recursos de interface que você pode personalizar.

:
Tabela 2. Recursos personalizáveis da interface do sistema no modo de bloqueio de tarefas
Recurso de interface do sistema Descrição
LOCK_TASK_FEATURE_HOME Mostra o botão "Página inicial". Ativar para telas de início personalizadas — tocando em uma O botão home não tem ação, a menos que você coloque o Android padrão na lista de permissões acesso rápido.
LOCK_TASK_FEATURE_OVERVIEW Mostra o botão "Visão geral" (tocar nesse botão abre a Recentes. Se você ativar esse botão, você também precisa ativar o botão "Página inicial".
LOCK_TASK_FEATURE_GLOBAL_ACTIONS Ativa a caixa de diálogo de ações globais que é exibida ao tocar e manter pressionado o botão liga/desliga. O único recurso ativado quando setLockTaskFeatures() não for chamado. Normalmente, um usuário não pode desligar o dispositivo se você desativar esta caixa de diálogo.
LOCK_TASK_FEATURE_NOTIFICATIONS Ativa as notificações para todos os apps. Isso mostra ícones de notificação na de status, notificações de alerta e a aba de notificações expansível. Se você ativar esse botão, também precisará ativar o botão "Página inicial". Tocando ações de notificação e botões que abrem novos painéis, não funcionam no bloqueio modo de tarefa.
LOCK_TASK_FEATURE_SYSTEM_INFO Ativa a área de informações do sistema da barra de status que contém indicadores como como conectividade, bateria e opções de som e vibração.
LOCK_TASK_FEATURE_KEYGUARD Ativa qualquer tela de bloqueio que possa estar definida no dispositivo. Normalmente, não adequado para dispositivos com usuários públicos, como quiosques de informações ou sinalização digital.
LOCK_TASK_FEATURE_NONE Desativa todos os recursos da interface do sistema listados acima.

Um DPC pode chamar DevicePolicyManager.getLockTaskFeatures() para receber a lista de recursos disponíveis em um dispositivo quando o modo de bloqueio de tarefas está ativado. Quando um dispositivo sai do modo de bloqueio de tarefas, a interface do usuário retorna ao estado exigido pelas políticas dos dispositivos existentes.

Bloquear janelas e sobreposições

Quando um app é executado no modo de bloqueio de tarefas, outros apps e serviços em segundo plano podem Cria novas janelas que o Android exibe na frente do app no modo de bloqueio de tarefas. Apps e serviços criam essas janelas para mostrar avisos, caixas de diálogo e sobreposições à a pessoa que está usando o dispositivo. Seu DPC pode evitar que isso aconteça adicionando o Restrição de usuário do DISALLOW_CREATE_WINDOWS. O exemplo a seguir mostra como fazer isso na Callback 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);
}

Seu DPC pode remover a restrição de usuário quando o dispositivo sai do modo de bloqueio de tarefas.

Outros recursos

Para saber mais sobre dispositivos dedicados, leia os seguintes documentos: