Android 10 (livello API 29) e versioni successive impongono limitazioni all'avvio delle attività quando l'app viene eseguita in background. Queste limitazioni contribuiscono a ridurre al minimo le interruzioni per l'utente e a mantenere il controllo di ciò che viene mostrato sullo schermo.
Questa guida presenta le notifiche come alternativa per avviare attività in background. Elenca inoltre i casi specifici in cui la limitazione non si applica.
Mostra notifiche
In quasi tutti i casi, le app in background devono mostrare notifiche sensibili al fattore temporale per fornire informazioni urgenti all'utente anziché 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 sulle notifiche offre diversi vantaggi per gli utenti:
- Quando utilizza il dispositivo, l'utente visualizza una notifica di avviso che gli consente di rispondere. L'utente mantiene il contesto attuale e ha il controllo sui contenuti visualizzati sullo schermo.
- Le notifiche urgenti rispettano le regole Non disturbare dell'utente. Ad esempio, gli utenti potrebbero consentire le chiamate solo da contatti specifici o da chiamanti abituali quando è attivata la modalità Non disturbare.
- Quando lo schermo del dispositivo è spento, l'intent a schermo intero viene avviato immediatamente.
- Nella schermata Impostazioni del dispositivo, l'utente può vedere quali app hanno inviato di recente notifiche, anche da 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 si verifica una o più delle seguenti condizioni:
- L'app ha una finestra visibile, ad esempio un'attività in primo piano.
- L'app ha un'attività nello stack indietro dell'attività in primo piano.
L'app ha un'attività nello stack precedente di un'attività esistente nella schermata Recenti.
L'app ha un'attività iniziata di recente.
L'app chiamata
finish()
su un'attività molto recente. Ciò si applica solo quando l'app aveva un'attività in primo piano o un'attività nello stack delle attività del task in primo piano al momento della chiamata difinish()
.L'app ha uno dei seguenti servizi vincolati dal sistema. Questi servizi potrebbero dover avviare 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 vincolato a un'altra app visibile. L'app vincolata al servizio deve rimanere visibile affinché l'app in background avvii 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 intent
PendingIntent
inviato da un'altra app visibile.L'app riceve una trasmissione di sistema in cui è previsto l'avvio di un'interfaccia utente. 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 che l'utente esegue su un dispositivo accoppiato.L'app è un controller dei criteri dei dispositivi in esecuzione in modalità Proprietario del dispositivo. I casi d'uso di esempio includono dispositivi aziendali completamente gestiti e dispositivi dedicati come segnaletica digitale e chioschi.
L'utente concede all'app l'autorizzazione
SYSTEM_ALERT_WINDOW
.
È necessario il consenso esplicito quando si avviano attività da PendingIntent
Per evitare di consentire avvii di attività accidentali in base alle condizioni elencate, a partire da Android 14 sono disponibili API esplicite che ti consentono di attivare o disattivare la concessione di autorizzazioni a un'app per gli avvii di attività.
Le app che hanno come target Android 15 o versioni successive non concederanno più implicitamente
i privilegi di avvio dell'attività in background (BAL) ai PendingIntents
che
creano. È necessario il consenso esplicito. A questo scopo, ecco le opzioni
a seconda che l'app invii o crei 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'opzione per consentire l'avvio dell'attività in background in base a queste eccezioni
L'attivazione deve avvenire solo se lo sviluppatore dell'app sa che l'app sta per avviare 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 del PendingIntent
Le app destinate ad Android 15 o versioni successive che creano un PendingIntent
ora devono
attivare esplicitamente l'opzione per consentire l'avvio dell'attività in background se vogliono che questi
PendingIntents
possano essere avviati alle condizioni elencate.
Nella maggior parte dei casi, l'app che avvia l'intent PendingIntent
deve essere quella che attiva l'opt-in.
Tuttavia, se l'app di creazione deve concedere questi privilegi:
PendingIntent
può essere avviato in qualsiasi momento l'app di creazione è visibile.- L'
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)
a
PendingIntent.getActivity()
o metodi simili.
Per ulteriori dettagli, consulta la documentazione di riferimento pertinente:
ActivityOptions.setPendingIntentBackgroundActivityStartMode
ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode
Modalità StrictMode
A partire da Android 16, lo sviluppatore dell'app può attivare la modalità Strict per ricevere una notifica quando l'avvio di un'attività viene bloccato (o rischia di essere bloccato quando viene aumentato l'SDK di destinazione dell'app).
Codice di esempio per l'attivazione all'inizio del metodo Application.onCreate()
dell'applicazione, dell'attività o di un altro componente dell'applicazione:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
StrictMode.setVmPolicy(
StrictMode.VmPolicy.Builder()
.detectBlockedBackgroundActivityLaunch()
.penaltyLog()
.build());
)
}
Per ulteriori dettagli, leggi la documentazione relativa alla modalità Strict.