Tryb blokowania zadań

W tym przewodniku dla programistów omawiamy, jak można powiązać specjalne urządzenia z 1 urządzeniem lub zestaw aplikacji. Jeśli korzystasz z usługi zarządzania urządzeniami mobilnymi (EMM) dewelopera lub integratora rozwiązań przeczytaj ten przewodnik, aby dodać tryb zadań blokady do i rozwiązania problemu.

Omówienie

Android może uruchamiać zadania w bardzo atrakcyjny sposób, zwany zadaniem blokady. . Trybu blokady możesz użyć, jeśli tworzysz aplikację kiosku lub Menu z aplikacjami do prezentacji. Gdy system jest uruchomiony w zadaniu blokady użytkownicy urządzeń zwykle nie widzą powiadomień, korzystają z treści spoza listy dozwolonych aplikacji lub wrócić do ekranu głównego (chyba że ekran główny znajduje się na liście dozwolonych).

Mogą działać tylko aplikacje znajdujące się na liście dozwolonych przez kontroler zasad dotyczących urządzeń (DPC) gdy system jest w trybie blokady zadań. Aplikacje znajdują się na liście dozwolonych, ponieważ użytkownik przy użyciu urządzenia nie zawsze może wyjść z trybu blokady zadania.

Jak połączyć aplikację znajdującą się na liście dozwolonych w trybie zadań blokady i DPC z listą dozwolonych zależy od problemu, który chcesz rozwiązać. Oto przykłady:

  • Jeden pakiet aplikacji, który łączy kiosk (do prezentowania treści) i mini DPC (aby dodać ją do listy dozwolonych w trybie zadania blokady).
  • DPC wchodzące w skład rozwiązania do zarządzania urządzeniami mobilnymi w firmie aplikacji mobilnych klienta w trybie blokady zadań.

Dostępność

Na Androidzie 5.0 lub nowszym system może działać w trybie blokady zadań. Programy z tabeli 1 które wersje Androida obsługują dodawanie aplikacji do listy dozwolonych według użytkowników.

Tabela 1. Obsługa wersji Androida w trybach administratora DPC
Wersja Androida Administruje przez DPC Uwagi
Android 5.0 (poziom interfejsu API 21) lub nowszy Urządzenie w pełni zarządzane
Android 8.0 (poziom interfejsu API 26) lub nowszy Powiązany użytkownik dodatkowy Użytkownik dodatkowy musi być powiązany z użytkownikiem głównym. Zobacz dla wielu użytkowników.
Android 9.0 (poziom interfejsu API 28) lub nowszy Użytkownik dodatkowy

W Androidzie 9.0 lub nowszym DPC może włączyć tryb blokady zadań w dowolnej aplikacji. We wcześniejszych wersjach aplikacja musi obsługiwać rozpoczynanie własnej aktywności w trybu blokady zadań.

Dodaj aplikacje do listy dozwolonych

DPC musi dodać aplikacje do listy dozwolonych, zanim będzie można ich używać w trybie blokady zadań. Zadzwoń do nas DevicePolicyManager.setLockTaskPackages() do dodaj aplikacje do listy dozwolonych na potrzeby trybu blokady zadań, jak pokazano w tym przykładzie:

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

Aby dowiedzieć się, które aplikacje znajdują się wcześniej na liście dozwolonych w trybie blokady zadań, DPC może wywołać metodę DevicePolicyManager.getLockTaskPackages() Inny powód aplikacje mogą dzwonić DevicePolicyManager.isLockTaskPermitted(), aby potwierdzić pakiet aplikacji obsługuje tryb blokady zadań.

Włącz tryb blokady zadań

W Androidzie 9.0 (poziom interfejsu API 28) lub nowszym możesz rozpocząć aktywność w innej aplikacji tutaj: trybu blokady zadań. jeśli jakaś aktywność jest już wykonywana na pierwszym planie lub musisz ponownie uruchomić aktywność. Zadzwoń do nas ActivityOptions.setLockTaskEnabled() i dostarcz te opcje dostępne podczas rozpoczynania aktywności. Ten fragment kodu przedstawia jeden ze sposobów wykonaj następujące czynności:

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

Na urządzeniach z Androidem w wersji starszej niż 9.0 aplikacja rozpoczyna własne działania w zadaniu blokady w trybie online, wywołując metodę Activity.startLockTask(). Aby zadzwonić aktywność musi być uruchomiona na pierwszym planie (patrz Activity-lifecycle koncepcjach), więc zalecamy wywołanie onResume() metody Activity lub Fragment Aby zadzwonić pod numer 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.
  }
}

Nie uruchamiaj trybu blokady zadań, gdy urządzenie jest zablokowane, ponieważ użytkownik może tego nie robić odblokować urządzenie. Możesz wywoływać metody KeyguardManager, aby Sprawdzanie, czy urządzenie jest zablokowane, i korzystaj z cyklu życia Activity wywołanie zwrotne (np. onResume(), które jest wywoływane po odblokowaniu) do uruchomić tryb blokady zadań.

Aplikacja w trybie blokady zadań może uruchamiać nowe działania, o ile tylko nie uruchamia nowego zadania (z wyjątkiem zadań uruchamiających aplikację znajdującą się na liście dozwolonych). Do i zrozumieć, w jaki sposób zadania są powiązane z czynnościami, przeczytaj przewodnik Omówienie zadań i Stos tylny.

Możesz też zadeklarować w pliku manifestu aplikacji, jak powinna zachowywać się aktywność, system działa w trybie zadań blokady; Automatyczne uruchamianie systemu aktywności w trybie blokady ekranu, ustaw android:lockTaskMode do if_whitelisted jako w tym przykładzie:

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

Więcej informacji o opcjach deklarowania znajdziesz w pliku manifestu aplikacji odwołanie do lockTaskMode.

Zatrzymaj tryb blokady zadań

DPC może zdalnie zatrzymać tryb blokady zadań, usuwając pakiet aplikacji z lista dozwolonych. Zadzwoń do nas DevicePolicyManager.setLockTaskPackages(), w Androida 6.0 (poziom interfejsu API 23) lub nowszego i pomiń nazwę pakietu w lista dozwolonych. Gdy zaktualizujesz listę dozwolonych, aplikacja wróci do poprzedniej wersji które można wykonać na stosie.

Jeśli aktywność miała wcześniej nazwę startLockTask(), może wywołać metodę wywołania Activity.stopLockTask(), aby wyłączyć tryb blokady zadań. Ta metoda działa tylko w przypadku aktywności, która uruchomiła tryb blokady zadań.

Wywołania zwrotne cyklu życia

DPC może chcieć wiedzieć, kiedy aplikacja (uruchomiona przez tego samego użytkownika) może być przydatna włącza i wyłącza tryb blokady zadań. Aby otrzymywać wywołania zwrotne, zastąp te ustawienia metody wywołania zwrotnego w podklasie DeviceAdminReceiver DPC:

onLockTaskModeEntering()
Wywoływane po przejściu aplikacji w tryb blokady zadań. Możesz uzyskać nazwę pakietu dla aplikacji za pomocą argumentu pkg.
onLockTaskModeExiting()
Wywoływane po zamknięciu trybu blokady zadania przez aplikację. To oddzwonienie nie otrzyma informacje o aplikacji.
.

Jeśli uruchomisz inną aplikację w trybie blokady zadań, musisz śledzić działanie w Twojej aplikacji. Aby sprawdzić, czy bieżąca aplikacja działa w zadaniu blokady użyj metod na ActivityManager, jak pokazano poniżej przykład:

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

Dostosowywanie interfejsu użytkownika

Gdy aplikacja działa w trybie blokady zadań, interfejs systemu zmienia się w w następujący sposób:

  • Pasek stanu jest pusty, a powiadomienia i informacje o systemie są ukryte.
  • Przyciski Strona główna i Przegląd są ukryte.
  • Inne aplikacje nie mogą uruchamiać nowych aktywności.
  • Ekran blokady (jeśli jest ustawiony) jest wyłączony.

W Androidzie 9.0 lub nowszym po włączeniu trybu blokady DPC może włączyć tę funkcję określonych funkcji interfejsu systemu na urządzeniu – przydatne dla programistów tworzących niestandardowy Menu z aplikacjami. Zadzwoń do nas DevicePolicyManager.setLockTaskFeatures() jak pokazano w tym fragmencie:

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

System wyłącza wszystkie funkcje, które nie są uwzględnione w argumencie flags. włączone funkcje interfejsu zachowywane są między uruchomieniami w trybie blokady zadań. Jeśli urządzenie jest już w trybie blokady zadań, wszelkie zmiany wprowadzone przez Ciebie w funkcjach zadania blokady mogą być wyświetlane od razu. Tabela 2 opisuje funkcje interfejsu, które możesz dostosować.

Tabela 2. Możliwe do dostosowania funkcje interfejsu systemowego w trybie blokady zadań
Funkcja interfejsu systemu Opis
LOCK_TASK_FEATURE_HOME Wyświetla przycisk strony głównej. Włącz dla niestandardowych programów uruchamiających – kliknij włączone Przycisk ekranu głównego nie działa, chyba że dodasz domyślny system Android do listy dozwolonych Menu z aplikacjami.
LOCK_TASK_FEATURE_OVERVIEW Wyświetla przycisk Przegląd (kliknięcie tego przycisku otwiera Ostatnie). Jeśli tego przycisku, musisz też włączyć przycisk strony głównej.
LOCK_TASK_FEATURE_GLOBAL_ACTIONS Włącza okno działań globalnych wyświetlane po przytrzymaniu przycisku przycisk zasilania. Jedyną funkcją, która jest włączona, setLockTaskFeatures() nie został wywołany. Użytkownik zwykle nie może wyłączyć urządzenia, jeśli wyłączyć to okno.
LOCK_TASK_FEATURE_NOTIFICATIONS Włącza powiadomienia dla wszystkich aplikacji. To pokazuje ikony powiadomień w pasek stanu, powiadomienia HUD i rozwijany obszar powiadomień. Jeśli włączysz ten przycisk, musisz też włączyć przycisk strony głównej. Dotykanie działania związane z powiadomieniami i przyciski otwierające nowe panele, nie działa z blokadą w trybie zadania.
LOCK_TASK_FEATURE_SYSTEM_INFO Włącza na pasku stanu obszar informacyjny o systemie, który zawiera wskaźniki takie jak: jak połączenia, bateria, dźwięk i wibracje.
LOCK_TASK_FEATURE_KEYGUARD Włącza każdy ekran blokady, który może być ustawiony na urządzeniu. Zwykle nie odpowiednie dla urządzeń dostępnych dla użytkowników publicznych, takich jak kioski informacyjne lub treści informacyjno-reklamowe.
LOCK_TASK_FEATURE_NONE Wyłącza wszystkie wymienione powyżej funkcje interfejsu systemowego.

DPC może zadzwonić DevicePolicyManager.getLockTaskFeatures(), aby otrzymać lista funkcji dostępnych na urządzeniu po włączeniu trybu blokady zadań. Kiedy urządzenie wyjdzie z trybu blokady zadania, interfejs użytkownika powróci do określonego stanu przy użyciu istniejących zasad dotyczących urządzeń.

Blokuj okna i nakładki

Gdy aplikacja działa w trybie blokady zadań, inne aplikacje i usługi w tle mogą tworzyć nowe okna, które Android wyświetla przed aplikacją w trybie blokady zadań. Aplikacje i usługi tworzą te okna, aby wyświetlać tosty, okna dialogowe i nakładki do osoby korzystającej z urządzenia. DPC może temu zapobiec, dodając parametr Ograniczenie dotyczące użytkownika DISALLOW_CREATE_WINDOWS. Poniższy przykład pokazuje, jak można to zrobić w funkcji onLockTaskModeEntering() – wywołanie zwrotne:

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

DPC może usunąć to ograniczenie, gdy urządzenie wyjdzie z trybu blokady.

Dodatkowe materiały

Więcej informacji o urządzeniach specjalnych znajdziesz w tych dokumentach: