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 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 di finish().

  • L'app ha uno dei seguenti servizi vincolati dal sistema. Questi servizi potrebbero dover lanciare una UI.

  • 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. 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.

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

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: