В этом руководстве для разработчиков рассказывается, как заблокировать специализированные устройства, чтобы на них можно было использовать только одно приложение или определенный набор приложений. Если вы разработчик или интегратор решений для управления мобильной инфраструктурой предприятия (EMM), прочитайте это руководство, чтобы узнать, как добавить режим блокировки задач в свое решение.
Обзор
В Android можно запускать задачи в режиме киоска, который называется режимом блокировки задач. Режим блокировки задач может пригодиться, если вы разрабатываете киоск-приложение или панель запуска для набора приложений. В режиме блокировки задач пользователи обычно не видят уведомления, не могут получить доступ к приложениям, которых нет в белом списке, и не могут вернуться на главный экран (если он не добавлен в белый список).
В режиме блокировки задач могут работать только приложения, добавленные в белый список контроллером правил для устройств (DPC). Приложения добавляются в белый список, потому что пользователь устройства не всегда может выйти из режима блокировки задач.
Способ объединения приложения, добавленного в белый список для режима блокировки задач, и контроллера политики устройств, добавленного в белый список, зависит от проблемы, которую вы хотите решить. Вот несколько примеров:
- Единый пакет приложения, который объединяет киоск (для показа контента) и мини-DPC (для добавления себя в белый список для режима блокировки задач).
- Контроллер политики устройств, который является частью решения для управления мобильной инфраструктурой предприятия и запускает мобильные приложения клиента в режиме блокировки задач.
Доступность
Режим блокировки задач поддерживается в Android 5.0 и более поздних версиях. В таблице 1 показано, какие версии Android поддерживают белые списки приложений для пользователей.
| Версию Android. | Контроллер политик на устройствах управляет | Примечания |
|---|---|---|
| Android 5.0 (уровень API 21) или более поздней версии; | Полностью управляемое устройство | |
| Android 8.0 (уровень API 26) или более поздняя версия | Аффилированный дополнительный пользователь | Дополнительный пользователь должен быть аффилирован с основным. Подробнее о поддержке нескольких пользователей… |
| Android 9.0 (уровень API 28) или более поздняя версия | Дополнительный пользователь |
В Android 9.0 и более поздних версиях контроллер политики устройств может запускать любое действие приложения в режиме блокировки задач. В более ранних версиях приложение должно поддерживать запуск собственных действий в режиме блокировки задач.
Как добавить приложения в белый список
Чтобы приложения можно было использовать в режиме блокировки задач, контроллер политики устройств должен добавить их в белый список. Вызовите DevicePolicyManager.setLockTaskPackages(), чтобы добавить приложения в белый список для режима блокировки задач, как показано в примере ниже.
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);
Чтобы узнать, какие приложения ранее были добавлены в белый список для режима блокировки задач, контроллер политики устройств может вызвать метод DevicePolicyManager.getLockTaskPackages(). Другие приложения могут вызывать DevicePolicyManager.isLockTaskPermitted(), чтобы подтвердить, что пакет приложения поддерживает режим блокировки задач.
Запустить режим блокировки задач
В Android 9.0 (уровень API 28) или более поздней версии вы можете запустить действие другого приложения в режиме блокировки задач. Если действие уже выполняется в активном или фоновом режиме, его нужно перезапустить. Вызовите ActivityOptions.setLockTaskEnabled() и укажите эти параметры при запуске действия. Ниже показано, как это сделать.
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()); }
В версиях Android до 9.0 приложение запускает собственные действия в режиме блокировки задач, вызывая Activity.startLockTask(). Чтобы вызвать этот метод, объект activity должен работать в активном режиме (см. Концепции жизненного цикла объекта activity). Поэтому мы рекомендуем вызывать его в методе onResume() класса Activity или Fragment. Вот как можно вызвать 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. } }
Не запускайте режим блокировки задач, когда устройство заблокировано, поскольку пользователь может не суметь разблокировать его. Вы можете вызвать методы KeyguardManager, чтобы узнать, заблокировано ли устройство, и использовать обратный вызов жизненного цикла Activity (например, onResume(), который вызывается после разблокировки), чтобы запустить режим блокировки задач.
Приложение в режиме блокировки задач может запускать новые действия, если они не начинают новую задачу (за исключением задач, которые запускают приложение из белого списка). Чтобы узнать, как задачи связаны с действиями, прочитайте руководство Задачи и обратный стек.
Вы также можете указать в файле манифеста приложения, как должно вести себя действие, когда система работает в режиме блокировки задач. Чтобы система автоматически запускала ваше действие в режиме блокировки задач, задайте для атрибута android:lockTaskMode значение if_whitelisted, как показано в следующем примере:
<activity
android:name=".MainActivity"
android:lockTaskMode="if_whitelisted">
<!-- ... -->
</activity>
Подробнее о том, как объявлять параметры в файле манифеста приложения, рассказывается в справочной статье о lockTaskMode.
Выйти из режима блокировки задач
Контроллер политики устройств может удаленно отключить режим блокировки задач, удалив пакет приложения из белого списка. Вызовите DevicePolicyManager.setLockTaskPackages() в Android 6.0 (уровень API 23) или более поздней версии и удалите название пакета из массива белого списка. После обновления белого списка приложение возвращается к предыдущей задаче в стеке.
Если объект activity ранее вызывал startLockTask(), то он может вызвать Activity.stopLockTask(), чтобы отключить режим блокировки задач. Этот метод работает только для действия, которое запустило режим блокировки задач.
Обратные вызовы жизненного цикла
Контроллеру политики устройств может быть полезно знать, когда приложение (запущенное в том же профиле пользователя) входит в режим блокировки задач и выходит из него. Чтобы получать обратные вызовы, переопределите следующие методы обратного вызова в подклассе DeviceAdminReceiver контроллера политики устройств:
onLockTaskModeEntering()- Вызывается после того, как приложение переходит в режим блокировки задач. Название пакета приложения можно получить из аргумента
pkg. onLockTaskModeExiting()- Вызывается после выхода приложения из режима блокировки задач. Этот обратный вызов не получает информацию о приложении.
Если вы запускаете другое приложение в режиме блокировки задач, вам нужно отслеживать статус его работы в своем приложении. Чтобы проверить, работает ли текущее приложение в режиме блокировки задач, используйте методы в ActivityManager, как показано в примере ниже.
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 ... }
Настройка интерфейса
Когда приложение работает в режиме блокировки задач, пользовательский интерфейс системы меняется следующим образом:
- Строка состояния пуста, уведомления и системная информация скрыты.
- Кнопки "Главный экран" и "Обзор" скрыты.
- Другие приложения не могут запускать новые действия.
- Блокировка экрана (если она настроена) отключена.
В Android 9.0 и более поздних версиях, когда включен режим блокировки задач, контроллер политики устройств может активировать определенные функции системного интерфейса на устройстве. Это полезно для разработчиков, создающих собственный лаунчер. Вызовите метод DevicePolicyManager.setLockTaskFeatures(), как показано в следующем фрагменте кода:
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);
Система отключит все функции, которые вы не укажете в аргументе flags. Включенные функции интерфейса сохраняются между запусками в режиме блокировки задач. Если устройство уже находится в режиме блокировки задач, все изменения, которые вы вносите в функции блокировки задач, отображаются немедленно. В таблице 2 описаны функции интерфейса, которые можно настроить.
| Функция системного интерфейса | Описание |
|---|---|
LOCK_TASK_FEATURE_HOME
|
Показывает кнопку "Главная страница". Включить для сторонних лаунчеров. Нажатие на включенную кнопку главного экрана не будет выполнять никаких действий, если вы не добавите в белый список лаунчер Android по умолчанию. |
LOCK_TASK_FEATURE_OVERVIEW
|
Показывает кнопку "Обзор" (при нажатии на нее открывается экран Недавние). Если вы включите эту кнопку, то также должны включить кнопку "Главная страница". |
LOCK_TASK_FEATURE_GLOBAL_ACTIONS
|
Включает диалоговое окно общих действий, которое появляется при долгом нажатии кнопки питания. Единственная функция, которая включена, когда не вызывается setLockTaskFeatures(). Если вы отключите это диалоговое окно, пользователь не сможет выключить устройство. |
LOCK_TASK_FEATURE_NOTIFICATIONS
|
Включает уведомления для всех приложений. В этом случае значки уведомлений будут показываться в строке состояния, на панели уведомлений и в виде всплывающих уведомлений. Если вы включите эту кнопку, то также должны включить кнопку "Главная страница". В режиме блокировки задач нельзя нажимать на кнопки уведомлений и действий, которые открывают новые панели. |
LOCK_TASK_FEATURE_SYSTEM_INFO
|
Включает область системной информации в строке состояния, которая содержит такие индикаторы, как подключение, батарея, а также параметры звука и вибрации. |
LOCK_TASK_FEATURE_KEYGUARD
|
Включает любой заблокированный экран, который может быть установлен на устройстве. Обычно не подходит для устройств, которыми пользуются разные люди, например для информационных киосков или цифровой наружной рекламы. |
LOCK_TASK_FEATURE_NONE
|
Отключает все перечисленные выше функции системного интерфейса. |
Контроллер политики устройств может вызвать метод DevicePolicyManager.getLockTaskFeatures(), чтобы получить список функций, доступных на устройстве, когда включен режим блокировки задач. Когда устройство выходит из режима блокировки задач, пользовательский интерфейс возвращается в состояние, предписанное существующими правилами для устройств.
Блокировка окон и оверлеев
Когда приложение работает в режиме блокировки задач, другие приложения и фоновые службы могут создавать новые окна, которые Android показывает поверх приложения в режиме блокировки задач.
Приложения и сервисы создают такие окна, чтобы показывать пользователю устройства всплывающие уведомления, диалоговые окна и оверлеи. Чтобы предотвратить это, контроллер политики устройств может добавить ограничение для пользователей DISALLOW_CREATE_WINDOWS.
Ниже показано, как это сделать в обратном вызове 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); }
Контроллер политики устройств может снять ограничение, когда устройство выйдет из режима блокировки задач.
Дополнительные ресурсы
Чтобы узнать больше о специализированных устройствах, ознакомьтесь со следующими документами:
- Руководство по специализированным устройствам с дополнительными примерами ограничений и улучшения пользовательского интерфейса.
- Обзор специализированных устройств – это обзор специализированных устройств.
- В статье Как управлять несколькими пользователями рассказывается, как предоставить доступ к устройствам нескольким пользователям.