Android 10 (livello API 29) e versioni successive impongono limitazioni su quando le app possono avviare attività quando vengono eseguite in background. Queste limitazioni contribuiscono a ridurre al minimo le interruzioni per l'utente e lo aiutano a mantenere un maggiore controllo su ciò che viene mostrato sullo schermo.
Questa guida presenta le notifiche come alternativa per avviare attività in background. Vengono inoltre elencati i casi specifici in cui la limitazione non si applica.
Mostra notifiche
In quasi tutti i casi, le app in background devono mostrare notifiche urgenti per fornire informazioni urgenti all'utente, invece di avviare direttamente un'attività. Queste notifiche includono la gestione di una chiamata in arrivo o di una sveglia attiva.
Questo sistema di avvisi e promemoria basato su notifiche offre diversi vantaggi agli utenti:
- Quando utilizza il dispositivo, l'utente vede una notifica che gli consente di rispondere. L'utente mantiene il proprio contesto corrente e ha il controllo sui contenuti visualizzati sullo schermo.
- Le notifiche urgenti rispettano le regole di Non disturbare dell'utente. Ad esempio, gli utenti potrebbero consentire le chiamate solo da contatti specifici o da utenti che chiamano spesso quando la modalità Non disturbare è attivata.
- Quando lo schermo del dispositivo è spento, l'intent a schermo intero si avvia immediatamente.
- Nella schermata Impostazioni del dispositivo, l'utente può vedere quali app hanno inviato di recente notifiche, inclusi canali di notifica specifici. Da questa schermata, l'utente può controllare le proprie preferenze di notifica.
Quando le app possono avviare attività
Le app in esecuzione su Android 10 o versioni successive possono avviare attività quando viene soddisfatta una o più delle seguenti condizioni:
- L'app ha una finestra visibile, ad esempio un'attività in primo piano.
- L'app ha un'attività nella back stack dell'attività in primo piano.
L'app ha un'attività nella pila di fondo di un'attività esistente nella schermata Recenti.
L'app ha un'attività iniziata di recente.
L'app
finish()
è stata chiamata su un'attività molto di recente. Questo si applica solo se l'app aveva un'attività in primo piano o un'attività nello stack posteriore dell'attività in primo piano al momento della chiamata difinish()
.L'app ha uno dei seguenti servizi vincolati dal sistema. Questi servizi potrebbero dover lanciare una UI.
AccessibilityService
AutofillService
CallRedirectionService
HostApduService
InCallService
TileService
(non applicabile in Android 14 (livello API 34) e versioni successive)VoiceInteractionService
VrListenerService
.
L'app ha un servizio associato a un'altra app visibile. L'app associata al servizio deve rimanere visibile per l'app in background per avviare correttamente le attività.
L'app riceve una notifica
PendingIntent
dal sistema. Nel caso di intent in attesa per servizi e ricevitori di trasmissione, l'app può avviare attività per alcuni secondi dopo l'invio dell'intent in attesa.L'app riceve un
PendingIntent
inviato da un'altra app visibile.L'app riceve una trasmissione di sistema in cui dovrebbe avviare un'UI. Alcuni esempi sono
ACTION_NEW_OUTGOING_CALL
eSECRET_CODE_ACTION
. L'app può avviare attività per alcuni secondi dopo l'invio della trasmissione.L'app è associata a un dispositivo hardware complementare tramite l'API
CompanionDeviceManager
. Questa API consente all'app di avviare attività in risposta alle azioni eseguite dall'utente su un dispositivo accoppiato.L'app è un controller dei criteri dei dispositivi in modalità Proprietario del dispositivo. Alcuni casi d'uso di esempio sono i dispositivi aziendali completamente gestiti e i dispositivi dedicati come la segnaletica digitale e i chioschi.
All'app viene concessa l'autorizzazione
SYSTEM_ALERT_WINDOW
dall'utente.
Attivazione obbligatoria quando si avviano attività da PendingIntent
Per evitare di consentire avvii involontari dell'attività in base alle condizioni elencate, a partire da Android 14 esistono API esplicite che ti consentono di attivare o disattivare la concessione di autorizzazioni di un'app per gli avvii dell'attività.
Per impostazione predefinita, le app che hanno come target Android 15 o versioni successive non concederanno più implicitamente i privilegi BAL (Attività in background) per i PendingIntents
che creano. A questo scopo, è necessaria un'attivazione esplicita. Queste sono le opzioni a seconda che l'app stia inviando o creando PendingIntents
.
Dal mittente del PendingIntent
Le app destinate ad Android 14 o versioni successive che vogliono avviare un PendingIntent
devono
- soddisfare le condizioni elencate e
- attivare l'avvio delle attività in background in base a queste eccezioni
Questa attivazione deve avvenire solo se lo sviluppatore dell'app sa che l'app inizierà un'attività.
Per attivare la funzionalità, l'app deve passare un bundle ActivityOptions
con
setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
a PendingIntent.send()
o metodi simili.
Dal creator di PendingIntent
Le app destinate ad Android 15 o versioni successive che creano un PendingIntent
ora devono attivare esplicitamente il lancio dell'attività in background se vogliono che i PendingIntents
siano avviabili nelle condizioni elencate.
Nella maggior parte dei casi, l'attivazione dovrebbe essere l'app che avvia il PendingIntent
.
Tuttavia, se l'app in fase di creazione deve concedere questi privilegi:
PendingIntent
può essere avviato in qualsiasi momento in cui l'app in fase di creazione è visibile.PendingIntent
può essere avviato in qualsiasi momento se l'app di creazione dispone di privilegi speciali.
Per attivare la funzionalità, l'app deve passare un bundle ActivityOptions
con
setPendingIntentCreatorBackgroundActivityStartMode
(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
al
PendingIntent.getActivity()
o a metodi simili.
Per ulteriori dettagli, leggi la documentazione di riferimento pertinente:
ActivityOptions.setPendingIntentBackgroundActivityStartMode
ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode