Bloccare la modalità attività

Questa guida per gli sviluppatori spiega come è possibile bloccare i dispositivi dedicati a un singolo dispositivo un'app o un insieme di app. Se gestisci la gestione della mobilità aziendale (EMM) per sviluppatori o integratori di soluzioni leggi questa guida per aggiungere la modalità di blocco attività al tuo soluzione.

Panoramica

Android può eseguire le attività in un modo immersivo, simile a un kiosk, chiamato attività di blocco . Puoi utilizzare la modalità di blocco delle attività se stai sviluppando un'applicazione kiosk o in Avvio applicazioni per presentare una raccolta di app. Quando il sistema viene eseguito in un'attività di blocco , gli utenti dei dispositivi in genere non possono vedere le notifiche, accedere ai dispositivi non inclusi nella lista consentita app o tornare alla schermata Home (a meno che la schermata Home non sia inclusa nella lista consentita).

È possibile eseguire solo le app che sono state inserite nella lista consentita da un controller dei criteri dei dispositivi (DPC) quando il sistema è in modalità di blocco attività. Le app sono inserite nella lista consentita perché la persona quando utilizzi il dispositivo non sempre riescono a uscire dalla modalità di blocco attività.

Come combinare l'app inclusa nella lista consentita per la modalità attività di blocco e il DPC (controller criteri dispositivi) nella lista consentita dipenderà dal problema che vuoi risolvere. Ecco alcuni esempi:

  • Un unico pacchetto dell'app che combina un kiosk (per presentare i contenuti) e un mini DPC (controller criteri dispositivi) (per inserire nella lista consentita la modalità di blocco attività).
  • Un DPC (controller criteri dispositivi) che fa parte di una soluzione di gestione della mobilità aziendale, alle app mobile del cliente in modalità di blocco attività.

Disponibilità

Il sistema può essere eseguito in modalità di blocco attività in Android 5.0 o versioni successive. La tabella 1 mostra quali versioni di Android supportano l'inserimento delle app nella lista consentita per utente.

Tabella 1. Supporto della versione di Android per le modalità di amministrazione DPC
Versione di Android Amministra DPC Note
Android 5.0 (livello API 21) o versioni successive Dispositivo completamente gestito
Android 8.0 (livello API 26) o versioni successive Utente secondario affiliato L'utente secondario deve essere affiliato all'utente principale. Consulta Panoramica di più utenti.
Android 9.0 (livello API 28) o versioni successive Utente secondario

In Android 9.0 o versioni successive un DPC può avviare l'attività di qualsiasi app in modalità di blocco attività. Nelle versioni precedenti, l'app deve già supportare l'avvio della propria attività in in modalità blocco attività.

Inserire app nella lista consentita

Un DPC deve inserire le app nella lista consentita prima che possano essere utilizzate in modalità di blocco attività. Chiama Da DevicePolicyManager.setLockTaskPackages() a Aggiungi le app alla lista consentita per la modalità di blocco attività, come mostrato nell'esempio seguente:

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

Per scoprire le app precedentemente inserite nella lista consentita per la modalità di blocco attività, un DPC può chiamare DevicePolicyManager.getLockTaskPackages() Altro le app possono chiamare DevicePolicyManager.isLockTaskPermitted() per confermare che un pacchetto dell'app supporti la modalità di blocco attività.

Avvia la modalità di blocco attività

In Android 9.0 (livello API 28) o versioni successive, puoi avviare l'attività di un'altra app in in modalità blocco attività. Se un'attività è già in esecuzione in primo piano o in background, devi riavviare l'attività. Chiama ActivityOptions.setLockTaskEnabled() e fornire questi quando avvii l'attività. Il seguente snippet mostra un modo per fai questo:

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

Nelle versioni di Android precedenti alla 9.0, un'app avvia le proprie attività nell'attività di blocco chiamando il numero Activity.startLockTask(). Per chiamare , l'attività deve essere eseguita in primo piano (vedi Ciclo di vita dell'attività principali), quindi ti consigliamo di chiamare metodo onResume() di un Activity o Fragment Ecco come puoi chiamare 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.
  }
}

Non avviare la modalità di blocco attività quando il dispositivo è bloccato perché l'utente potrebbe non essere in grado di sbloccare il dispositivo. Puoi chiamare i metodi KeyguardManager per scopri se il dispositivo è bloccato e utilizza un ciclo di vita di Activity (ad esempio onResume() che viene chiamato dopo lo sblocco) per avviare la modalità di blocco attività.

Un'app in modalità di blocco attività può avviare nuove attività, purché l'attività non avvia una nuova attività, ad eccezione di quelle che avviano un'app inclusa nella lista consentita. A la relazione tra le attività e le attività, leggi la guida Comprendere Tasks e pila posteriore.

In alternativa, puoi dichiarare nel file manifest dell'app file come deve comportarsi un'attività quando il sistema è in modalità di blocco attività. Per fare in modo che il sistema venga eseguito automaticamente attività in modalità di blocco attività, imposta Attributo android:lockTaskMode a if_whitelisted come come mostrato nell'esempio seguente:

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

Per scoprire di più sulla dichiarazione delle opzioni nel file manifest dell'app, leggi il riferimento lockTaskMode.

Interrompi la modalità attività di blocco

Un DPC può interrompere da remoto la modalità di blocco dell'attività rimuovendo il pacchetto dell'app dal nella lista consentita. Chiama DevicePolicyManager.setLockTaskPackages(), nel Android 6.0 (livello API 23) o versioni successive e ometti il nome del pacchetto dalla dell'array nella lista consentita. Quando aggiorni la lista consentita, l'app torna alla versione precedente un'attività in pila.

Se un'attività in precedenza chiamata startLockTask(), può chiamare Activity.stopLockTask() per interrompere la modalità di blocco attività. Questo metodo funziona solo per l'attività che ha avviato la modalità di blocco attività.

Callback del ciclo di vita

Il DPC potrebbe trovare utile sapere quando un'app (in esecuzione con lo stesso utente) entra ed esce dalla modalità attività di blocco. Per ricevere i callback, esegui l'override di quanto segue nella sottoclasse DeviceAdminReceiver del tuo DPC:

onLockTaskModeEntering()
Chiamata dopo che un'app è attiva in modalità di blocco attività. Puoi ottenere il nome del pacchetto dall'argomento pkg.
onLockTaskModeExiting()
Chiamato dopo che un'app esce dalla modalità attività di blocco. Questa richiamata non riceve informazioni sull'app.
.

Se avvii un'altra app in modalità di blocco attività, devi monitorare nella tua app. Per verificare se l'app corrente è in esecuzione nell'attività di blocco utilizza i metodi su ActivityManager come mostrato di seguito esempio:

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

Personalizzare l'UI

Quando un'app viene eseguita in modalità di blocco attività, l'interfaccia utente di sistema (UI) cambia nei seguenti modi:

  • La barra di stato è vuota con notifiche e informazioni di sistema nascoste.
  • I pulsanti Home e Panoramica sono nascosti.
  • Altre app non possono avviare nuove attività.
  • La schermata di blocco (se impostata) è disattivata.

In Android 9.0 o versioni successive, quando è attiva la modalità di blocco attività, il DPC può attivare alcune funzioni UI di sistema sul dispositivo, utili agli sviluppatori che creano Avvio app. Chiama DevicePolicyManager.setLockTaskFeatures() come mostrato nel seguente snippet:

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

Il sistema disattiva tutte le funzionalità che non includi nell'argomento flags. La le funzionalità UI abilitate vengono mantenute tra un avvio e l'altro in modalità di blocco attività. Se il dispositivo è già in modalità di blocco attività, se apporti modifiche alle funzionalità vengono visualizzate immediatamente. La tabella 2 descrive le funzionalità dell'interfaccia utente che è possibile personalizzare.

Tabella 2. Funzionalità personalizzabili dell'interfaccia utente di sistema in modalità di blocco attività
Funzionalità UI di sistema Descrizione
LOCK_TASK_FEATURE_HOME Mostra il pulsante Home. Attiva per Avvio app personalizzate: toccando un pulsante Il pulsante Home non ha azione, a meno che non inserisci l'Android predefinito nella lista consentita Avvio app.
LOCK_TASK_FEATURE_OVERVIEW Mostra il pulsante Panoramica (se tocchi questo pulsante si apre schermata Recenti). Se abilitare questo pulsante, devi abilitare anche il pulsante Home.
LOCK_TASK_FEATURE_GLOBAL_ACTIONS Attiva la finestra di dialogo delle azioni globali che viene visualizzata quando si preme a lungo il tasto di accensione. L'unica funzione che viene attivata quando setLockTaskFeatures() non è stato chiamato. Solitamente l'utente non riesce a spegnere il dispositivo se disattiva questa finestra di dialogo.
LOCK_TASK_FEATURE_NOTIFICATIONS Attiva le notifiche per tutte le app. Vengono visualizzate le icone di notifica barra di stato, notifiche in evidenza e area notifiche espandibile. Se attivi questo pulsante, dovrai attivare anche il pulsante Home. Toccare azioni di notifica e pulsanti che aprono nuovi riquadri, non funzionano in blocco modalità attività.
LOCK_TASK_FEATURE_SYSTEM_INFO Consente di attivare l'area delle informazioni sul sistema nella barra di stato, che contiene indicatori quali come connettività, batteria, suoni e vibrazione.
LOCK_TASK_FEATURE_KEYGUARD Attiva tutte le schermate di blocco che potrebbero essere impostate sul dispositivo. In genere no adatta ai dispositivi con utenti pubblici, come chioschi informativi o la segnaletica digitale.
LOCK_TASK_FEATURE_NONE Disattiva tutte le funzionalità UI di sistema elencate sopra.

Un DPC può chiamare DevicePolicyManager.getLockTaskFeatures() per ricevere l'elenco di funzionalità disponibili su un dispositivo quando è attiva la modalità di blocco attività. Quando un dispositivo esce dalla modalità di blocco attività, l'interfaccia utente torna allo stato richiesto in base ai criteri esistenti relativi ai dispositivi.

Bloccare finestre e overlay

Quando un'app viene eseguita in modalità di blocco attività, altre app e servizi in background possono creare nuove finestre che Android mostra davanti all'app in modalità di blocco attività. App e servizi creano queste finestre per mostrare toast, finestre di dialogo e overlay ai la persona che utilizza il dispositivo. Il DPC può impedire questi problemi aggiungendo il parametro Limitazione utente DISALLOW_CREATE_WINDOWS. L'esempio seguente mostra come eseguire questa operazione nell' Chiamata di 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);
}

Il DPC può rimuovere la limitazione relativa all'utente quando il dispositivo esce dalla modalità attività di blocco.

Risorse aggiuntive

Per scoprire di più sui dispositivi dedicati, leggi i seguenti documenti: