Mode tâche verrouillée

Ce guide du développeur explique comment les appareils dédiés peuvent être verrouillés sur une application ou un ensemble d'applications. Si vous êtes un développeur EMM (Enterprise Mobility Management, gestion de la mobilité en entreprise) ou un intégrateur de solutions, lisez ce guide pour ajouter le mode tâches verrouillées à votre solution.

Présentation

Android peut exécuter des tâches de manière immersive (comme un kiosque) appelée mode tâches verrouillées. Vous pouvez utiliser le mode tâches verrouillées si vous développez une application kiosque ou un lanceur d'applications pour présenter un ensemble d'applications. Lorsque le système s'exécute en mode tâches verrouillées, les utilisateurs d'appareils ne peuvent généralement pas voir les notifications, accéder aux applications non autorisées ni revenir à l'écran d'accueil (sauf si celui-ci figure sur la liste d'autorisation).

Seules les applications ajoutées à la liste d'autorisation par un outil de contrôle des règles relatives aux appareils (DPC) peuvent s'exécuter lorsque le système est en mode tâches verrouillées. Les applications sont ajoutées à la liste d'autorisation, car la personne qui utilise l'appareil ne peut pas toujours quitter le mode tâches verrouillées.

La manière dont vous combinez l'application figurant sur la liste d'autorisation pour le mode tâches verrouillées et l'outil DPC de la liste d'autorisation dépend du problème que vous souhaitez résoudre. Voici quelques exemples :

  • Un package d'application unique qui combine un kiosque (pour présenter du contenu) et un mini-outil de contrôle des règles relatives aux appareils (pour s'ajouter à la liste d'autorisation pour le mode tâches verrouillées).
  • DPC faisant partie d'une solution de gestion de la mobilité en entreprise, qui lance les applications mobiles du client en mode tâches verrouillées.

Disponibilité

Le système peut s'exécuter en mode tâches verrouillées sous Android 5.0 ou version ultérieure. Le tableau 1 indique les versions d'Android compatibles avec l'ajout d'applications à la liste d'autorisation par utilisateur.

Tableau 1. Compatibilité de la version d'Android avec les modes d'administration DPC
Version d'Android Le DPC gère Notes
Android 5.0 (niveau d'API 21) ou version ultérieure Appareil entièrement géré
Android 8.0 (niveau d'API 26) ou version ultérieure Utilisateur secondaire affilié L'utilisateur secondaire doit être affilié à l'utilisateur principal. Consultez la présentation des fonctionnalités multi-utilisateurs.
Android 9.0 (niveau d'API 28) ou version ultérieure Utilisateur secondaire

Sur Android 9.0 ou version ultérieure, un DPC peut lancer l'activité de n'importe quelle application en mode tâches verrouillées. Dans les versions précédentes, l'application doit déjà prendre en charge le démarrage de sa propre activité en mode tâches verrouillées.

Ajouter des applications à la liste d'autorisation

Un DPC doit ajouter des applications à la liste d'autorisation pour qu'elles puissent être utilisées en mode tâches verrouillées. Appelez DevicePolicyManager.setLockTaskPackages() pour ajouter des applications à la liste d'autorisation du mode tâches verrouillées, comme illustré dans l'exemple suivant:

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

Pour connaître les applications précédemment ajoutées à la liste d'autorisation pour le mode tâches verrouillées, un DPC peut appeler DevicePolicyManager.getLockTaskPackages(). D'autres applications peuvent appeler DevicePolicyManager.isLockTaskPermitted() pour vérifier qu'un package d'application est compatible avec le mode tâches verrouillées.

Démarrer le mode tâches verrouillées

Sous Android 9.0 (niveau d'API 28) ou version ultérieure, vous pouvez démarrer l'activité d'une autre application en mode tâches verrouillées. Si une activité est déjà en cours d'exécution au premier plan ou en arrière-plan, vous devez la relancer. Appelez ActivityOptions.setLockTaskEnabled() et fournissez ces options au démarrage de l'activité. L'extrait de code suivant montre une façon de procéder:

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

Dans les versions d'Android antérieures à la version 9.0, une application démarre ses propres activités en mode tâche verrouillée en appelant Activity.startLockTask(). Pour appeler cette méthode, l'activité doit s'exécuter au premier plan (consultez la section Concepts du cycle de vie d'une activité). Nous vous suggérons donc d'appeler la méthode onResume() d'un objet Activity ou Fragment. Voici comment appeler 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.
  }
}

Ne démarrez pas le mode tâches verrouillées lorsque l'appareil est verrouillé, car l'utilisateur pourrait ne pas pouvoir le déverrouiller. Vous pouvez appeler les méthodes KeyguardManager pour savoir si l'appareil est verrouillé et utiliser un rappel de cycle de vie Activity (tel que onResume(), appelé après déverrouillage) pour démarrer le mode tâches verrouillées.

Une application en mode tâches verrouillées peut lancer de nouvelles activités tant qu'elle ne démarre pas de nouvelle tâche, à l'exception des tâches qui lancent une application figurant sur la liste d'autorisation. Pour comprendre le lien entre les tâches et les activités, consultez le guide Comprendre les tâches et la pile "Retour".

Vous pouvez également déclarer le comportement d'une activité lorsque le système s'exécute en mode tâches verrouillées dans le fichier manifeste d'application. Pour que le système exécute automatiquement votre activité en mode tâches verrouillées, définissez l'attribut android:lockTaskMode sur if_whitelisted, comme illustré dans l'exemple suivant:

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

Pour en savoir plus sur la déclaration d'options dans le fichier manifeste de l'application, consultez la documentation de référence sur lockTaskMode.

Arrêter le mode tâches verrouillées

Un DPC peut arrêter à distance le mode tâches verrouillées en supprimant le package d'application de la liste d'autorisation. Appelez DevicePolicyManager.setLockTaskPackages() sous Android 6.0 (niveau d'API 23) ou une version ultérieure, et omettez le nom du package du tableau de la liste d'autorisation. Lorsque vous mettez à jour la liste d'autorisation, l'application revient à la tâche précédente dans la pile.

Si une activité était précédemment appelée startLockTask(), elle peut appeler Activity.stopLockTask() pour arrêter le mode tâches verrouillées. Cette méthode ne fonctionne que pour l'activité qui a lancé le mode tâches verrouillées.

Rappels de cycle de vie

Votre DPC peut trouver utile de savoir quand une application (exécutée par le même utilisateur) passe en mode tâches verrouillées. Pour recevoir des rappels, remplacez les méthodes de rappel suivantes dans la sous-classe DeviceAdminReceiver de votre DPC:

onLockTaskModeEntering()
Appelée lorsqu'une application passe en mode tâches verrouillées. Vous pouvez obtenir le nom du package d'une application à partir de l'argument pkg.
onLockTaskModeExiting()
Appelée lorsqu'une application quitte le mode tâches verrouillées. Ce rappel ne reçoit pas d'informations sur l'application.

Si vous lancez une autre application en mode tâches verrouillées, vous devez suivre l'état d'exécution dans votre propre application. Pour vérifier si l'application actuelle s'exécute en mode tâches verrouillées, utilisez les méthodes sur ActivityManager, comme indiqué dans l'exemple suivant:

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

Personnaliser l'UI

Lorsqu'une application s'exécute en mode tâches verrouillées, l'interface utilisateur du système (UI) change comme suit:

  • La barre d'état est vide, et les notifications et les informations système sont masquées.
  • Les boutons "Accueil" et "Aperçu" sont masqués.
  • Les autres applications ne peuvent pas lancer de nouvelles activités.
  • L'écran de verrouillage (s'il est défini) est désactivé.

Dans Android 9.0 ou version ultérieure, lorsque le mode tâches verrouillées est activé, votre DPC peut activer certaines fonctionnalités d'UI du système sur l'appareil, ce qui est utile pour les développeurs qui créent un lanceur personnalisé. Appelez DevicePolicyManager.setLockTaskFeatures() comme indiqué dans l'extrait de code suivant:

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

Le système désactive toutes les fonctionnalités que vous n'incluez pas dans l'argument flags. Les fonctionnalités d'interface utilisateur activées sont conservées entre les lancements en mode tâches verrouillées. Si l'appareil est déjà en mode tâches verrouillées, toutes les modifications que vous apportez aux fonctionnalités de tâches verrouillées s'affichent immédiatement. Le tableau 2 décrit les fonctionnalités de l'interface utilisateur que vous pouvez personnaliser.

Tableau 2. Fonctionnalités personnalisables de l'UI du système en mode tâches verrouillées
Fonctionnalité d'UI du système Description
LOCK_TASK_FEATURE_HOME Affiche le bouton d'accueil. Activer pour les lanceurs d'applications personnalisés : appuyer sur un bouton d'accueil activé n'a aucune action, sauf si vous ajoutez le lanceur d'applications Android par défaut à la liste d'autorisation.
LOCK_TASK_FEATURE_OVERVIEW Affiche le bouton "Aperçu" (l'écran Recents (Récents) s'ouvre lorsque l'utilisateur appuie dessus). Si vous activez ce bouton, vous devez également activer le bouton Accueil.
LOCK_TASK_FEATURE_GLOBAL_ACTIONS Active la boîte de dialogue des actions générales qui s'affiche lorsque vous appuyez de manière prolongée sur le bouton Marche/Arrêt. La seule fonctionnalité activée lorsque setLockTaskFeatures() n'a pas été appelé. En général, l'utilisateur ne peut pas éteindre l'appareil si vous désactivez cette boîte de dialogue.
LOCK_TASK_FEATURE_NOTIFICATIONS Active les notifications pour toutes les applications. Les icônes de notification s'affichent dans la barre d'état, les notifications prioritaires et le volet des notifications à développer. Si vous activez ce bouton, vous devez également activer le bouton Accueil. L'appui sur les actions de notification et les boutons qui ouvrent de nouveaux panneaux ne fonctionne pas en mode tâches verrouillées.
LOCK_TASK_FEATURE_SYSTEM_INFO Active la zone d'informations système de la barre d'état qui contient des indicateurs tels que la connectivité, la batterie, et les options de son et de vibreur.
LOCK_TASK_FEATURE_KEYGUARD Active tous les écrans de verrouillage pouvant être définis sur l'appareil. Cette solution ne convient généralement pas aux appareils destinés à des utilisateurs publics, tels que les kiosques d'information ou la signalétique numérique.
LOCK_TASK_FEATURE_NONE Désactive toutes les fonctionnalités de l'interface utilisateur du système répertoriées ci-dessus.

Un DPC peut appeler DevicePolicyManager.getLockTaskFeatures() pour obtenir la liste des fonctionnalités disponibles sur un appareil lorsque le mode tâches verrouillées est activé. Lorsqu'un appareil quitte le mode tâches verrouillées, l'interface utilisateur revient à l'état exigé par les règles d'appareil existantes.

Bloquer les fenêtres et les superpositions

Lorsqu'une application s'exécute en mode tâches verrouillées, d'autres applications et services d'arrière-plan peuvent créer des fenêtres qu'Android affiche devant l'application en mode tâches verrouillées. Les applications et les services créent ces fenêtres pour afficher des toasts, des boîtes de dialogue et des superpositions à l'utilisateur de l'appareil. Votre DPC peut empêcher cela en ajoutant la restriction d'utilisateur DISALLOW_CREATE_WINDOWS. L'exemple suivant montre comment procéder dans le rappel 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);
}

Votre DPC peut supprimer la restriction utilisateur lorsque l'appareil quitte le mode tâches verrouillées.

Ressources supplémentaires

Pour en savoir plus sur les appareils dédiés, consultez les documents suivants: