Limitazioni relative all'avvio di attività in background

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 le attività da 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 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 su notifiche offre diversi vantaggi agli utenti:

  • Quando utilizza il dispositivo, l'utente vede una notifica in primo piano che gli consente di rispondere. L'utente mantiene il 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 viene avviato 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 posteriore 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 vale solo se al momento dell'esecuzione della chiamata a finish() l'app aveva un'attività in primo piano o un'attività nella pila di fondo dell'attività in primo piano.

  • L'app ha uno dei seguenti servizi vincolati dal sistema. Per questi servizi potrebbe essere necessario avviare un'interfaccia utente.

  • 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 e SECRET_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. Esempi di casi d'uso includono dispositivi aziendali completamente gestiti nonché dispositivi dedicati come segnaletica digitale e kiosk.

  • L'app ha ricevuto l'autorizzazione SYSTEM_ALERT_WINDOW dall'utente.

Attivazione obbligatoria quando si avviano attività da PendingIntent

Per evitare l'attivazione accidentale di Avvi attività in base alle condizioni elencate, a partire da Android 14 sono disponibili API esplicite che ti consentono di attivare o disattivare la concessione delle autorizzazioni di un'app per Avvi attività.

Per impostazione predefinita, le app che hanno come target Android 15 o versioni successive non concederanno più implicitamente i privilegi di lancio delle attività in background (BAL) ai PendingIntents che creano. È necessaria l'attivazione esplicita. Per farlo, queste sono le opzioni disponibili, a seconda che l'app stia inviando o creando PendingIntents.

Tabella degli intenti in attesa
Figura 1: flusso decisionale per l'avvio delle attività in background.

Dal mittente del PendingIntent

Le app che hanno come target Android 14 o versioni successive e 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'app che avvia PendingIntent dovrebbe essere quella da attivare. 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: