Aufgabenmodus sperren

In diesem Entwicklerhandbuch wird erläutert, wie dedizierte Geräte an eine einzelne App oder eine Reihe von Apps gebunden werden können. Wenn Sie ein Enterprise Mobility Management-Entwickler (EMM) oder Lösungsintegrator sind, lesen Sie diesen Leitfaden, um Ihrer Lösung den Sperraufgabenmodus hinzuzufügen.

Übersicht

Android kann Aufgaben in einem immersiven, kioskähnlichen Modus ausführen, der als Sperraufgabenmodus bezeichnet wird. Sie können den Modus „Aufgaben sperren“ verwenden, wenn Sie eine Kiosk-App oder einen Launcher zum Präsentieren einer Sammlung von Apps entwickeln. Wenn das System im Modus für gesperrte Aufgaben ausgeführt wird, können Gerätenutzer normalerweise keine Benachrichtigungen sehen, nicht auf Apps zugreifen, die nicht auf der Zulassungsliste stehen, und auch nicht zum Startbildschirm zurückkehren (es sei denn, der Startbildschirm ist auf der Zulassungsliste).

Nur Apps, die von einem Device Policy Controller (DPC) auf die Zulassungsliste gesetzt wurden, können ausgeführt werden, wenn sich das System im Sperrbildschirmmodus befindet. Apps werden auf die Zulassungsliste gesetzt, da die Person, die das Gerät verwendet, den Modus zum Sperren nicht immer verlassen kann.

Wie Sie die Anwendungen auf der Zulassungsliste für den Sperraufgabenmodus und den DPC auf der Zulassungsliste kombinieren, hängt vom Problem ab, das Sie lösen möchten. Hier einige Beispiele:

  • Ein einzelnes App-Paket, das einen Kiosk (zum Präsentieren von Inhalten) und einen Mini-DPC kombiniert, um sich selbst für den Sperraufgabenmodus auf die Zulassungsliste zu setzen.
  • Ein DPC, der Teil einer Enterprise Mobility Management-Lösung ist, der die mobilen Apps des Kunden im Sperrmodus startet.

Verfügbarkeit

Das System kann unter Android 5.0 oder höher im Modus „Gesperrte Aufgabe“ ausgeführt werden. In Tabelle 1 sehen Sie, welche Android-Versionen dies unterstützen, Apps nach Nutzer auf die Zulassungsliste zu setzen.

Tabelle 1. Unterstützung von Android-Versionen für DPC-Administratormodi
Android-Version DPC-Administration Hinweise
Android 5.0 (API-Level 21) oder höher Vollständig verwaltetes Gerät
Android 8.0 (API-Level 26) oder höher Zugehöriger sekundärer Nutzer Der sekundäre Nutzer muss mit dem primären Nutzer verknüpft sein. Weitere Informationen finden Sie unter Mehrere Nutzer.
Android 9.0 (API-Level 28) oder höher Sekundärer Nutzer

Ab Android 9.0 kann ein DPC alle Aktivitäten einer App in den Modus „Gesperrte Aufgabe“ versetzen. In früheren Versionen muss die Anwendung bereits das Starten ihrer eigenen Aktivität im Sperraufgabenmodus unterstützen.

Apps auf die Zulassungsliste setzen

Ein DPC muss Apps auf die Zulassungsliste setzen, bevor sie im Sperrmodus-Modus verwendet werden können. Rufen Sie DevicePolicyManager.setLockTaskPackages() auf, um Apps für den Modus „Sperraufgabe“ auf die Zulassungsliste zu setzen, wie im folgenden Beispiel gezeigt:

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

Ein DPC kann DevicePolicyManager.getLockTaskPackages() aufrufen, um die Apps zu ermitteln, die zuvor für den Modus „Sperraufgabe“ auf die Zulassungsliste gesetzt wurden. Andere Apps können DevicePolicyManager.isLockTaskPermitted() aufrufen, um zu bestätigen, dass ein App-Paket den Modus „Sperraufgaben“ unterstützt.

Modus zum Sperren von Aufgaben starten

Ab Android 9.0 (API-Level 28) können Sie die Aktivitäten einer anderen App im Sperrmodus starten. Wenn eine Aktivität bereits im Vordergrund oder Hintergrund ausgeführt wird, müssen Sie sie neu starten. Rufen Sie ActivityOptions.setLockTaskEnabled() auf und geben Sie diese Optionen an, wenn Sie die Aktivität starten. Das folgende Snippet zeigt eine Möglichkeit:

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

In Android-Versionen vor 9.0 startet eine App ihre eigenen Aktivitäten im Modus zum Sperren von Aufgaben, indem sie Activity.startLockTask() aufruft. Zum Aufrufen dieser Methode muss die Aktivität im Vordergrund ausgeführt werden (siehe Konzepte des Aktivitätslebenszyklus). Wir empfehlen daher den Aufruf in der Methode onResume() von Activity oder Fragment. So können Sie startLockTask() anrufen:

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

Starten Sie den Modus „Aufgaben sperren“ nicht, wenn das Gerät gesperrt ist, da der Nutzer es möglicherweise nicht entsperren kann. Sie können KeyguardManager-Methoden aufrufen, um herauszufinden, ob das Gerät gesperrt ist, und einen Activity-Lebenszyklus-Callback verwenden (z. B. onResume(), der nach dem Entsperren aufgerufen wird), um den Aufgabenmodus zum Sperren zu starten.

Eine App im Modus „Gesperrte Aufgabe“ kann neue Aktivitäten starten, solange durch die Aktivität keine neue Aufgabe gestartet wird – mit Ausnahme von Aufgaben, die eine App auf der Zulassungsliste starten. Informationen dazu, wie Aufgaben mit Aktivitäten zusammenhängen, finden Sie im Leitfaden Aufgaben und Backstack verstehen.

Alternativ können Sie in Ihrer App-Manifestdatei deklarieren, wie sich eine Aktivität verhalten soll, wenn das System im Sperrmodus ausgeführt wird. Wenn das System Ihre Aktivität automatisch im Modus „Gesperrte Aufgabe“ ausführen soll, setzen Sie das Attribut android:lockTaskMode auf if_whitelisted, wie im folgenden Beispiel gezeigt:

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

Weitere Informationen zum Deklarieren von Optionen in der App-Manifestdatei finden Sie in der Referenz zu lockTaskMode.

Modus zum Sperren von Aufgaben beenden

Ein DPC kann den Modus für die Aufgabensperrung per Fernzugriff beenden. Dazu wird das Anwendungspaket aus der Zulassungsliste entfernt. Rufen Sie in Android 6.0 (API-Level 23) oder höher DevicePolicyManager.setLockTaskPackages() auf und lassen Sie den Paketnamen aus dem Array der Zulassungsliste weg. Wenn Sie die Zulassungsliste aktualisieren, kehrt die Anwendung zur vorherigen Aufgabe im Stack zurück.

Wenn eine Aktivität zuvor als startLockTask() bezeichnet wurde, kann die Aktivität Activity.stopLockTask() aufrufen, um den Modus „Aufgaben sperren“ zu beenden. Diese Methode funktioniert nur für die Aktivität, mit der der Modus zum Sperren von Aufgaben gestartet wurde.

Lebenszyklus-Callbacks

Für den DPC kann es hilfreich sein zu wissen, wann eine Anwendung, die im selben Nutzer ausgeführt wird, in den Sperraufgabenmodus wechselt und diesen beendet. Um Callbacks zu erhalten, überschreiben Sie die folgenden Callback-Methoden in der Unterklasse DeviceAdminReceiver Ihres DPC:

onLockTaskModeEntering()
Wird aufgerufen, nachdem eine App in den Modus zum Sperren von Aufgaben wechselt. Sie können den Paketnamen einer Anwendung aus dem Argument pkg abrufen.
onLockTaskModeExiting()
Wird aufgerufen, nachdem eine App den Modus zum Sperren von Aufgaben beendet hat. Dieser Callback erhält keine Informationen zur App.

Wenn Sie eine andere App im Modus zum Sperren von Aufgaben starten, müssen Sie den Status „Wird ausgeführt“ in Ihrer eigenen App verfolgen. Um zu prüfen, ob die aktuelle App im Modus zum Sperren von Aufgaben ausgeführt wird, verwenden Sie die Methoden für ActivityManager, wie im folgenden Beispiel gezeigt:

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

Benutzeroberfläche anpassen

Wenn eine App im Modus zum Sperren von Aufgaben ausgeführt wird, ändert sich die Systembenutzeroberfläche (UI) so:

  • Die Statusleiste ist leer und Benachrichtigungen und Systeminformationen sind ausgeblendet.
  • Die Schaltflächen „Startseite“ und „Übersicht“ sind ausgeblendet.
  • Andere Apps können keine neuen Aktivitäten starten.
  • Sofern festgelegt, ist der Sperrbildschirm deaktiviert.

Ab Android 9.0 können bei aktiviertem Modus zum Sperren von Aufgaben über den DPC bestimmte System-UI-Funktionen auf dem Gerät aktiviert werden. Das ist hilfreich für Entwickler, die einen benutzerdefinierten Launcher erstellen. Rufen Sie DevicePolicyManager.setLockTaskFeatures() auf, wie im folgenden Snippet gezeigt:

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

Das System deaktiviert alle Funktionen, die nicht in das Argument flags aufgenommen sind. Die aktivierten UI-Funktionen bleiben zwischen dem Start in den Modus „Sperraufgabe“ erhalten. Wenn sich das Gerät bereits im Modus für die Sperraufgabe befindet, werden alle Änderungen, die Sie an den Funktionen der Sperraufgabe vornehmen, sofort angezeigt. In Tabelle 2 werden die UI-Funktionen beschrieben, die Sie anpassen können.

Tabelle 2. Anpassbare System-UI-Funktionen im Modus „Gesperrte Aufgabe“
System-UI-Funktion Beschreibung
LOCK_TASK_FEATURE_HOME Die Home-Taste wird angezeigt. Für benutzerdefinierte Launcher aktivieren: Das Antippen einer aktivierten Startbildschirmtaste hat keine Aktion, sofern du den Standard-Android-Launcher nicht auf die Zulassungsliste setzt.
LOCK_TASK_FEATURE_OVERVIEW Zeigt die Schaltfläche „Übersicht“ an (Durch Tippen auf diese Schaltfläche wird der Bildschirm Zuletzt verwendet geöffnet). Wenn Sie diese Schaltfläche aktivieren, müssen Sie auch die Startbildschirmtaste aktivieren.
LOCK_TASK_FEATURE_GLOBAL_ACTIONS Aktiviert das Dialogfeld für globale Aktionen, das angezeigt wird, wenn die Ein/Aus-Taste lange gedrückt wird. Die einzige Funktion, die aktiviert wird, wenn setLockTaskFeatures() nicht aufgerufen wurde. Nutzer können das Gerät normalerweise nicht ausschalten, wenn du dieses Dialogfeld deaktivierst.
LOCK_TASK_FEATURE_NOTIFICATIONS Aktiviert Benachrichtigungen für alle Apps. Es werden Benachrichtigungssymbole in der Statusleiste, Vorabbenachrichtigungen und die maximierbare Benachrichtigungsleiste angezeigt. Wenn Sie diese Schaltfläche aktivieren, müssen Sie auch die Startbildschirmtaste aktivieren. Aktionen und Schaltflächen für Benachrichtigungen, mit denen neue Bereiche geöffnet werden, funktionieren im Modus „Aufgaben sperren“ nicht.
LOCK_TASK_FEATURE_SYSTEM_INFO Aktiviert den Bereich mit Systeminformationen in der Statusleiste, der Anzeigen wie Konnektivität, Akku sowie Töne und Vibrationsoptionen enthält.
LOCK_TASK_FEATURE_KEYGUARD Aktiviert jeden Sperrbildschirm, der auf dem Gerät eingerichtet werden kann. Normalerweise nicht für Geräte mit öffentlichen Nutzern wie Informationskiosks oder digitale Beschilderung geeignet.
LOCK_TASK_FEATURE_NONE Deaktiviert alle oben aufgeführten Funktionen der System-UI.

Ein DPC kann DevicePolicyManager.getLockTaskFeatures() aufrufen, um die Liste der auf einem Gerät verfügbaren Funktionen abzurufen, wenn der Modus zum Sperren von Aufgaben aktiviert ist. Wenn der Modus zum Sperren eines Geräts beendet wird, kehrt die Benutzeroberfläche in den von den vorhandenen Geräterichtlinien festgelegten Status zurück.

Fenster und Overlays blockieren

Wenn eine App im Modus für gesperrte Aufgaben ausgeführt wird, können andere Apps und Hintergrunddienste neue Fenster erstellen, die Android vor der App im Modus für gesperrte Aufgaben anzeigt. Diese Fenster werden von Apps und Diensten erstellt, um der Person, die das Gerät verwendet, Toasts, Dialogfelder und Overlays anzuzeigen. Der DPC kann dies verhindern, indem er die Nutzereinschränkung DISALLOW_CREATE_WINDOWS hinzufügt. Das folgende Beispiel zeigt, wie das im onLockTaskModeEntering()-Callback möglich ist:

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

Der DPC kann die Nutzereinschränkung aufheben, wenn das Gerät den Modus zum Sperren des Geräts beendet.

Weitere Informationen

Weitere Informationen zu dedizierten Geräten finden Sie in den folgenden Dokumenten: