Limitazioni relative all'avvio di attività in background

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

  • L'app dispone di uno dei seguenti servizi vincolati dal sistema. Questi servizi potrebbero dover avviare una UI.

  • 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 e SECRET_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: