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.
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.
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:
- Libro di ricette sui dispositivi dedicati con ulteriori esempi per limitare la scelta dispositivi mobili e migliorare l'esperienza utente.
- La panoramica dei dispositivi dedicati è una panoramica dispositivi dedicati.
- Gestione di più utenti spiega come condividere dispositivi tra utenti.