Заблокировать режим задачи

В этом руководстве разработчика объясняется, как можно привязать выделенные устройства к одному приложению или набору приложений. Если вы являетесь разработчиком или интегратором решений для управления мобильностью предприятия (EMM), прочтите это руководство, чтобы добавить режим задачи блокировки в свое решение.

Обзор

Android может запускать задачи в захватывающем режиме, напоминающем киоск, который называется режимом блокировки задач . Вы можете использовать режим блокировки задач, если вы разрабатываете киоск-приложение или средство запуска для представления коллекции приложений. Когда система работает в режиме блокировки задач, пользователи устройств обычно не могут видеть уведомления, получать доступ к приложениям, не внесенным в белый список, или возвращаться на главный экран (если главный экран не внесен в белый список).

Только приложения, включенные в список разрешенных контроллером политики устройств (DPC), могут запускаться, когда система находится в режиме блокировки задач. Приложения занесены в список разрешенных, поскольку человек, использующий устройство, не всегда может выйти из режима блокировки задач.

Способ объединения приложения, внесенного в список разрешенных для режима задач блокировки, и DPC из белого списка будет зависеть от проблемы, которую вы хотите решить. Вот несколько примеров:

  • Единый пакет приложения, который сочетает в себе киоск (для представления контента) и мини-ЦОД (для внесения себя в список разрешенных для режима блокировки задач).
  • ЦОД, являющийся частью решения по управлению мобильностью предприятия, запускающий мобильные приложения клиента в режиме блокировки задач.

Доступность

Система может работать в режиме блокировки задач в Android 5.0 или более поздней версии. В таблице 1 показано, какие версии Android поддерживают внесение приложений в белый список по пользователям.

Таблица 1 . Поддержка версии Android для режимов администрирования ЦОД.
Android-версия ЦОД администрирует Примечания
Android 5.0 (уровень API 21) или выше Полностью управляемое устройство
Android 8.0 (уровень API 26) или выше Аффилированный дополнительный пользователь Дополнительный пользователь должен быть связан с основным пользователем. См. обзор нескольких пользователей .
Android 9.0 (уровень API 28) или выше Дополнительный пользователь

В Android 9.0 и более поздних версиях ЦОД может запускать любое действие приложения в режиме блокировки задач. В более ранних версиях приложение уже должно поддерживать запуск собственного действия в режиме блокировки задач.

Приложения из белого списка

ЦОД должен внести приложения в список разрешенных, прежде чем их можно будет использовать в режиме блокировки задач. Вызовите DevicePolicyManager.setLockTaskPackages() чтобы добавить приложения в список разрешенных для режима блокировки задач, как показано в следующем примере:

Котлин

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

Ява

// 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() и укажите эти параметры при запуске действия. В следующем фрагменте показан один из способов сделать это:

Котлин

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

Ява

// 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() . Чтобы вызвать этот метод, действие должно выполняться на переднем плане (см. Концепции жизненного цикла действия ), поэтому мы предлагаем вызвать метод onResume() Activity или Fragment . Вот как вы можете вызвать startLockTask() :

Котлин

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

Ява

// 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) или более поздней версии и опустите имя пакета из массива белого списка. При обновлении белого списка приложение возвращается к предыдущей задаче в стеке.

Если действие ранее вызывалось startLockTask() , оно может вызвать Activity.stopLockTask() чтобы остановить режим задачи блокировки. Этот метод работает только для действия, которое запустило режим блокировки задач.

Обратные вызовы жизненного цикла

Вашему ЦОД может быть полезно знать, когда приложение (работающее от того же пользователя) входит в режим блокировки задач и выходит из него. Чтобы получать обратные вызовы, переопределите следующие методы обратного вызова в подклассе DeviceAdminReceiver вашего ЦОД:

onLockTaskModeEntering()
Вызывается после того, как приложение переходит в режим блокировки задач. Вы можете получить имя пакета приложения из аргумента pkg .
onLockTaskModeExiting()
Вызывается после выхода приложения из режима блокировки задач. Этот обратный вызов не получает информацию о приложении.

Если вы запускаете другое приложение в режиме блокировки задач, вам необходимо отслеживать статус работы в вашем собственном приложении. Чтобы проверить, работает ли текущее приложение в режиме задачи блокировки, используйте методы ActivityManager , как показано в следующем примере:

Котлин

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

Ява

// 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() , как показано в следующем фрагменте:

Котлин

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

Ява

// 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 описаны функции пользовательского интерфейса, которые вы можете настроить.

Таблица 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() :

Котлин

// 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)
}

Ява

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

Ваш ЦОД может снять ограничение пользователя, когда устройство выходит из режима задачи блокировки.

Дополнительные ресурсы

Чтобы узнать больше о выделенных устройствах, прочитайте следующие документы: