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.
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.
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:
- Manual para dispositivos dedicados com mais exemplos de como restringir o uso e melhorar a experiência do usuário.
- Visão geral para dispositivos dedicados: dispositivos dedicados.
- Gerenciar vários usuários explica como compartilhar dispositivos entre usuários.