Android 10 (livello API 29) e superiori applicano limitazioni relative a quando le app possono iniziare attività quando l'app viene eseguita in background. Queste limitazioni consentono di ridurre al minimo le interruzioni per l'utente e di avere un maggiore controllo su ciò che viene mostrato sullo schermo.
Questa guida presenta le notifiche come alternativa per avviare attività in background. Sono inoltre elencati i casi specifici in cui la restrizione non si applica.
Mostra invece 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 telefonata in arrivo o una sveglia attiva.
Questo sistema di avvisi e promemoria basato su notifiche offre diversi vantaggi per gli utenti:
- Quando utilizza il dispositivo, l'utente vede una notifica 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, quando la modalità Non disturbare è attivata, gli utenti potrebbero consentire solo le chiamate da contatti specifici o da chiamanti ripetuti.
- 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 eseguite 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 stack posteriore dell'attività in primo piano.
L'app ha un'attività nello stack posteriore di un'attività esistente nella schermata Recenti.
L'app ha un'attività iniziata molto di recente.
L'app chiamata
finish()
per un'attività molto recente. Questo vale solo quando l'app presentava un'attività in primo piano o un'attività nello stack posteriore dell'attività in primo piano al momento della chiamata difinish()
.L'app dispone di 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 associato a un'altra app visibile. L'app associata al servizio deve rimanere visibile in modo che l'app in background possa avviare le attività correttamente.
L'app riceve una notifica
PendingIntent
dal sistema. Nel caso di intent in attesa per servizi e ricevitori di trasmissioni, l'app può avviare attività per alcuni secondi dopo l'invio dell'intent in sospeso.L'app riceve un
PendingIntent
che viene inviato da un'altra app visibile.L'app riceve un broadcast di sistema in cui è previsto il lancio di una 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 viene associata a un dispositivo hardware companion 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. Esempi di casi d'uso includono dispositivi aziendali completamente gestiti e dispositivi dedicati come la segnaletica digitale e i kiosk.
All'app viene concessa l'autorizzazione
SYSTEM_ALERT_WINDOW
dall'utente.
Attivazione richiesta quando avvii attività da PendingIntent
Per evitare di consentire avvii involontari dell'attività in base alle condizioni elencate, a partire da Android 14 sono presenti API esplicite che ti consentono di attivare o disattivare la concessione di autorizzazioni app per gli avvii Attività.
Per impostazione predefinita, le app che hanno come target Android 15 o versioni successive non concedono più implicitamente i privilegi di lancio per attività in background a PendingIntents
che creano.
È richiesta l'attivazione esplicita. A questo scopo, queste sono le opzioni a seconda che l'app invii o crei PendingIntents
.
Dal mittente di 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
Questa attivazione dovrebbe avvenire solo se lo sviluppatore dell'app sa che l'app sta per avviare un'attività.
Per l'attivazione, l'app deve trasmettere un bundle ActivityOptions
con
setPendingIntentBackgroundActivityStartMode(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
a PendingIntent.send()
o a metodi simili.
Da parte dell'autore di PendingIntent
Le app che hanno come target Android 15 o versioni successive che creano PendingIntent
devono ora attivare
esplicitamente l'attivazione per consentire l'avvio di attività in background se vogliono che
PendingIntents
sia avviabile alle condizioni elencate.
Nella maggior parte dei casi, dovrebbe essere l'app che avvia il PendingIntent
.
Tuttavia, se l'app di creazione deve concedere i seguenti privilegi:
- Puoi avviare
PendingIntent
in qualsiasi momento in cui l'app di creazione è visibile. PendingIntent
può essere avviato in qualsiasi momento se l'app di creazione dispone di privilegi speciali.
Per l'attivazione, l'app deve trasmettere un bundle ActivityOptions
con
setPendingIntentCreatorBackgroundActivityStartMode
(ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED)
a
PendingIntent.getActivity()
o a metodi simili.
Per ulteriori dettagli, leggi la documentazione di riferimento pertinente:
ActivityOptions.setPendingIntentBackgroundActivityStartMode
ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode