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 l'avvio di attività accidentali in base alle contizioni 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 gli avvii Attività.

Consulta:

  • ActivityOptions.setPendingIntentBackgroundActivityStartMode
  • ActivityOptions.setPendingIntentCreatorBackgroundActivityStartMode

Dal mittente di PendingIntent

Le app destinate ad Android 14 o versioni successive che vogliono avviare un PendingIntent devono

  • rispettare le contizioni 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 destinate ad Android 15 o versioni successive che creano PendingIntent devono

  • rispettare le contizioni elencate e
  • attivare l'opzione per consentire l'avvio dell'attività in background in base a queste eccezioni

Nella maggior parte dei casi, è necessario attivare l'app che avvia PendingIntent.

Quando l'app che crea PendingIntent viene attivata, si verifica quanto segue:

  • PendingIntent può essere avviato in qualsiasi momento in cui è visibile l'app di creazione
  • puoi avviare PendingIntent in qualsiasi momento se l'app di creazione dispone privilegi speciali

È quindi buona norma non passare PendingIntent a un'app non attendibile e annullare l'elemento PendingIntent quando non deve più essere utilizzato.

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.