Android 10 (livello API 29) e versioni successive impongono limitazioni su quando le app possono avviare attività quando sono in esecuzione in background. Queste limitazioni contribuiscono a ridurre al minimo le interruzioni per l'utente e a mantenere un maggiore controllo su ciò che viene mostrato sullo schermo.
Questa guida presenta le notifiche come alternativa all'avvio delle attività in background. Elenca anche i casi specifici in cui la limitazione non si applica.
Mostrare le notifiche
In quasi tutti i casi, le app in background devono mostrare notifiche urgenti 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 vede una notifica in evidenza 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 ripetuti quando la modalità Non disturbare è attiva.
- 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, incluse quelle provenienti 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 vengono soddisfatte 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 back stack dell' attività in primo piano.
L'app ha un'attività nello stack indietro di un'attività esistente nella schermata Recenti.
L'app ha un'attività avviata di recente.
L'app ha chiamato
finish()su un'attività di recente. Questo si applica solo quando l'app aveva un'attività in primo piano o un'attività nello stack indietro dell'attività in primo piano al momento della chiamata difinish().L'app ha uno dei seguenti servizi associati dal sistema. Questi servizi potrebbero dover avviare un'interfaccia utente.
AccessibilityServiceAutofillServiceCallRedirectionServiceHostApduServiceInCallServiceTileService(non applicabile in Android 14 (livello API 34) e versioni successive)VoiceInteractionServiceVrListenerService.
L'app ha un servizio associato a un'altra app visibile. L'app associata al servizio deve rimanere visibile affinché l'app in background possa avviare le attività correttamente.
L'app riceve una notifica
PendingIntentdal sistema. Nel caso di pending intent per servizi e broadcast receiver, l'app può avviare attività per alcuni secondi dopo l'invio del pending intent.L'app riceve un
PendingIntentinviato da un'altra app visibile.L'app riceve un annuncio di sistema in cui è previsto che avvii un'interfaccia utente. Esempi includono
ACTION_NEW_OUTGOING_CALLeSECRET_CODE_ACTION. L'app può avviare attività per alcuni secondi dopo l'invio del broadcast.L'app è associata a un dispositivo hardware complementare tramite l'
CompanionDeviceManagerAPI. Questa API consente all'app di avviare attività in risposta alle azioni eseguite dall'utente su un dispositivo accoppiato.L'app è un controller di policy dei dispositivi in esecuzione in modalità device owner. 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.
Consenso richiesto per l'avvio delle attività da PendingIntent
Per impostazione predefinita, le app che hanno come target Android 15 o versioni successive non concederanno più implicitamente
i privilegi di avvio di attività in background (BAL) a PendingIntents che
creano. È necessario un consenso esplicito. A questo scopo, sono disponibili le seguenti opzioni
a seconda che l'app invii o crei PendingIntents.
Dal mittente del PendingIntent
Le app che hanno come target Android 14 o versioni successive e che vogliono avviare un PendingIntent devono
- soddisfare le condizioni elencate e
- attivare l'opzione per consentire l'avvio di attività in background in base a queste eccezioni
Questa opzione deve essere attivata solo se lo sviluppatore di app sa che l'app avvierà un'attività.
Per attivare l'opzione, l'app deve passare un bundle ActivityOptions con
setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
ai metodi PendingIntent.send() o simili.
Dal creatore del PendingIntent
Le app che hanno come target Android 15 o versioni successive e che creano un PendingIntent devono ora
attivare esplicitamente l'opzione per consentire l'avvio di attività in background se vogliono che questi
PendingIntents siano avviabili nelle condizioni elencate.
Nella maggior parte dei casi, l'app che avvia il PendingIntent deve essere quella che attiva l'opzione.
Tuttavia, se l'app di creazione deve concedere questi privilegi:
- Il
PendingIntentpuò essere avviato in qualsiasi momento l'app di creazione è visibile. - Il
PendingIntentpuò essere avviato in qualsiasi momento se l'app di creazione dispone di privilegi speciali.
Per attivare l'opzione, l'app deve passare un ActivityOptions bundle con
setPendingIntentCreatorBackgroundActivityStartMode
(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED) ai
PendingIntent.getActivity() o simili.
Per ulteriori dettagli, consulta la documentazione di riferimento pertinente:
ActivityOptions.setPendingIntentBackgroundActivityStartModeActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode
Modalità StrictMode
A partire da Android 16, lo sviluppatore di app può attivare la modalità StrictMode per ricevere una notifica quando l'avvio di un'attività viene bloccato (o rischia di essere bloccato quando viene aumentato l'SDK target dell'app).
Esempio di codice da attivare 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, consulta la documentazione della modalità StrictMode.