Ottimizza per sospensione e standby delle app

Android dispone di due funzionalità di risparmio energetico che prolungano la durata della batteria degli utenti gestendo il comportamento delle app quando un dispositivo non è collegato a una fonte di alimentazione: Sospensione e Standby delle app. La funzionalità Sospensione riduce il consumo della batteria posticipando l'attività della CPU e della rete in background delle app quando il dispositivo non viene utilizzato per lunghi periodi di tempo. Standby delle app rinvia l'attività di rete in background per le app senza attività utente recente.

Quando il dispositivo è in modalità Sospensione, l'accesso delle app a determinate risorse che consumano molta batteria viene posticipato fino al periodo di manutenzione. Le limitazioni specifiche sono elencate nella sezione Restrizioni relative alla gestione dell'alimentazione.

Le funzionalità Sospensione e Standby delle app gestiscono il comportamento di tutte le app in esecuzione su Android 6.0 o versioni successive, indipendentemente dal fatto che abbiano come target specifico il livello API 23. Per garantire la migliore esperienza agli utenti, testa l'app in modalità Sospensione e Standby e apporta le modifiche necessarie al codice. Le seguenti sezioni forniscono dettagli.

Informazioni sulla sospensione

Se un utente lascia un dispositivo scollegato e fermo per un determinato periodo di tempo, con lo schermo spento, il dispositivo entra in modalità Sospensione. In modalità Sospensione, il sistema tenta di risparmiare batteria limitando l'accesso delle app ai servizi di rete e che consumano molta CPU. Impedisce inoltre alle app di accedere alla rete e rinvia job, sincronizzazioni e allarmi standard.

Periodicamente, il sistema esce dalla modalità Sospensione per un breve periodo di tempo per consentire alle app di completare le attività differite. Durante questo periodo di manutenzione, il sistema esegue tutte le sincronizzazioni, i processi e gli allarmi in attesa e consente alle app di accedere alla rete.

Figura 1. La funzionalità Sospensione prevede un periodo di manutenzione ricorrente per consentire alle app di usare la rete e gestire le attività in sospeso.

Al termine del periodo di manutenzione, il sistema entra di nuovo in modalità di sospensione, sospendendo l'accesso alla rete e posticipando processi, sincronizzazioni e allarmi. Nel tempo, il sistema pianifica i periodi di manutenzione con minore frequenza, contribuendo a ridurre il consumo della batteria in caso di inattività prolungata quando il dispositivo non è in carica.

Quando l'utente riattiva il dispositivo spostandolo, accendendo lo schermo o collegando un caricabatterie, il sistema esce dalla modalità Sospensione e tutte le app ripristinano la normale attività.

Limitazioni relative alla sospensione

Quando è attiva la modalità Sospensione, il sistema applica le seguenti limitazioni alle app:

Elenco di controllo per la sospensione

Adatta la tua app alla funzionalità Sospensione

La sospensione può influire sulle app in modo diverso, a seconda delle funzionalità offerte e dei servizi che utilizzano. Molte app funzionano normalmente a cicli di sospensione senza modifiche. In alcuni casi, è necessario ottimizzare il modo in cui l'app gestisce rete, sveglie, processi e sincronizzazione. Le app devono essere in grado di gestire in modo efficiente le attività durante ogni periodo di manutenzione.

Per aiutarti a programmare le sveglie, puoi usare due AlarmManager metodi: setAndAllowWhileIdle() e setExactAndAllowWhileIdle(). Con questi metodi puoi impostare sveglie che si attivano anche se il dispositivo è in modalità Sospensione.

È probabile che la limitazione relativa alla sospensione dell'accesso alla rete influisca anche sulla tua app, specialmente se l'app si basa su messaggi in tempo reale come solleciti o notifiche. Se la tua app richiede una connessione permanente alla rete per ricevere messaggi, utilizza Firebase Cloud Messaging (FCM), se possibile.

Per confermare che l'app si comporta come previsto con la modalità Sospensione, puoi utilizzare i comandi adb per forzare il sistema ad attivare e disattivare la modalità Sospensione e a osservare il comportamento dell'app. Per i dettagli, consulta Testare con sospensione e standby delle app.

Informazioni sullo standby delle app

La funzionalità Standby delle app consente al sistema di stabilire che un'app è inattiva quando l'utente non la usa attivamente. Il sistema determina se l'utente non tocca l'app per un determinato periodo di tempo e non si applica nessuna delle seguenti condizioni:

  • L'utente avvia esplicitamente l'app.
  • L'app ha un processo attualmente in primo piano, come attività o servizio in primo piano oppure utilizzato da un'altra attività o servizio in primo piano.
  • L'app genera una notifica che gli utenti vedono nella schermata di blocco o nella barra delle notifiche.

Quando l'utente collega il dispositivo a una fonte di alimentazione, il sistema rilascia le app dallo stato di standby, consentendo loro di accedere liberamente alla rete ed eseguire eventuali job in sospeso e sincronizzazioni. Se il dispositivo è inattivo per lunghi periodi di tempo, il sistema consente alle app inattive di accedere alla rete circa una volta al giorno.

Usa FCM per interagire con l'app quando il dispositivo è inattivo

Firebase Cloud Messaggiging (FCM) è un servizio cloud-to-device che consente di supportare la messaggistica downstream in tempo reale tra i servizi di backend e le app sui dispositivi Android. FCM fornisce un'unica connessione permanente al cloud. Tutte le app che hanno bisogno di messaggistica in tempo reale possono condividere questa connessione. Questa connessione condivisa ottimizza notevolmente il consumo della batteria, rendendo superflua la gestione di connessioni permanenti separate da parte di diverse app, che possono esaurire rapidamente la batteria. Per questo motivo, se la tua app richiede l'integrazione della messaggistica con un servizio di backend, ti consigliamo vivamente di utilizzare FCM, se possibile, anziché mantenere una connessione di rete permanente.

FCM è ottimizzato per funzionare con le modalità di inattività Sospensione e Standby delle app. I messaggi FCM ad alta priorità ti consentono di riattivare l'app per coinvolgere l'utente. In modalità Sospensione o Standby delle app, il sistema consegna il messaggio e concede all'app l'accesso temporaneo ai servizi di rete e ai wakelock parziali, quindi riporta il dispositivo o l'app allo stato inattivo. Per le notifiche visibili agli utenti e sensibili al tempo, ti consigliamo di utilizzare messaggi ad alta priorità per abilitare la consegna in modalità Sospensione. I messaggi ad alta priorità possono generare notifiche. Per ulteriori informazioni, consulta le linee guida di FCM sui messaggi ad alta priorità.

Per i messaggi che non generano notifiche, come mantenere aggiornati i contenuti dell'app in background o avviare sincronizzazioni dei dati, utilizza messaggi FCM con priorità normale. I messaggi con priorità normale vengono recapitati immediatamente se il dispositivo non è in Sospensione. Se il dispositivo è in modalità Sospensione, questi vengono inviati durante i periodi di manutenzione periodici della sospensione o non appena l'utente riattiva il dispositivo.

Come best practice generale, se la tua app richiede la messaggistica downstream, utilizza FCM. Se la tua app utilizza già FCM, assicurati che utilizzi messaggi ad alta priorità solo per i messaggi che comportano notifiche rivolte agli utenti.

Supporto per altri casi d'uso

Quasi tutte le app sono in grado di supportare la sospensione, gestendo la connettività di rete, le sveglie, i job e le sincronizzazioni, nonché utilizzando messaggi FCM. Per un insieme ristretto di casi d'uso, potrebbe non essere sufficiente. In questi casi, il sistema fornisce un elenco configurabile di app parzialmente esenti dalle ottimizzazioni di sospensione e standby delle app.

Un'app parzialmente esente può utilizzare la rete e bloccare wakelock parziali durante sospensione e standby delle app. Tuttavia, all'app si applicano altre limitazioni, come avviene per le altre app. Ad esempio, i job e le sincronizzazioni dell'app vengono differiti a partire dal livello API 23 e successivi e i suoi normali allarmi AlarmManager non si attivano. Un'app può verificare se è attualmente nell'elenco delle esenzioni chiamando isIgnoringBatteryOptimizations().

Gli utenti possono configurare manualmente l'elenco delle app esenti in Impostazioni > Batteria > Ottimizzazione batteria. In alternativa, il sistema offre alle app alcuni metodi per chiedere agli utenti di esentarle:

Un'app può verificare se è attualmente nell'elenco delle esenzioni chiamando isIgnoringBatteryOptimizations().

Esegui test con sospensione e standby delle app

Per garantire un'esperienza ottimale ai tuoi utenti, testa completamente l'app in modalità Sospensione e Standby delle app.

Testare l'app con Sospensione

Puoi verificare la modalità Sospensione procedendo nel seguente modo:

  1. Configura un dispositivo hardware o un dispositivo virtuale con un'immagine di sistema Android 6.0 (livello API 23) o versioni successive.
  2. Collega il dispositivo al computer di sviluppo e installa l'app.
  3. Esegui l'app e lasciala attiva.
  4. Forza la modalità di inattività del sistema eseguendo questo comando:
        $ adb shell dumpsys deviceidle force-idle
        
  5. Quando è tutto pronto, esci dalla modalità inattiva eseguendo questo comando:
        $ adb shell dumpsys deviceidle unforce
        
  6. Riattiva il dispositivo eseguendo questo comando:
        $ adb shell dumpsys battery reset
        
  7. Osserva il comportamento dell'app dopo aver riattivato il dispositivo. Assicurati che l'app venga ripristinata correttamente quando il dispositivo esce dalla modalità Sospensione.

Testare l'app con la funzionalità Standby delle app

Per testare la modalità standby dell'app con la tua app:

  1. Configura un dispositivo hardware o un dispositivo virtuale con un'immagine di sistema Android 6.0 (livello API 23) o versioni successive.
  2. Collega il dispositivo al computer di sviluppo e installa l'app.
  3. Esegui l'app e lasciala attiva.
  4. Forza l'attivazione della modalità standby dell'app per l'app eseguendo questi comandi:
        $ adb shell dumpsys battery unplug
        $ adb shell am set-inactive <packageName> true
        
  5. Simula il attivazione dell'app utilizzando i seguenti comandi:
        $ adb shell am set-inactive <packageName> false
        $ adb shell am get-inactive <packageName>
        
  6. Osserva il comportamento dell'app dopo averla riattivata. Assicurati che l'app venga ripristinata automaticamente dalla modalità standby. In particolare, controlla se le notifiche e i lavori in background della tua app funzionano come previsto.

Casi d'uso accettabili per l'esenzione

La tabella seguente evidenzia diversi casi d'uso e indica se le app possono usare l'azione dell'intent ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS in queste situazioni. In generale, la tua app non soddisfa queste eccezioni, a meno che la funzionalità Sospensione o Standby dell'app non interrompa la funzione di base dell'app o non esista un motivo tecnico per cui l'app non può utilizzare messaggi FCM ad alta priorità.

Per ulteriori informazioni, vedi Assistenza per altri casi d'uso.

Tipo Caso d'uso Puoi utilizzare FCM? Un'esenzione accettabile? Notes
App di messaggistica immediata, chat o chiamate. Richiede la consegna di messaggi in tempo reale agli utenti quando il dispositivo è in modalità Sospensione o l'app è in standby app. Sì, utilizzando FCM Non accettabile Utilizza i messaggi FCM ad alta priorità per riattivare l'app e accedere alla rete.
Sì, ma non utilizza messaggi FCM ad alta priorità.
App di messaggistica immediata, chat o chiamate; app VOIP aziendali. No, non è possibile utilizzare FCM a causa della dipendenza tecnica da un altro servizio di messaggistica oppure le funzionalità Sospensione e Standby delle app interrompono la funzione di base dell'app. Accettabile
App Emergenze. App che proteggono gli utenti e le loro famiglie. Se applicabile. Accettabile
App di automazione delle attività. La funzione principale dell'app è la pianificazione di azioni automatizzate, ad esempio per la messaggistica immediata, le chiamate vocali o la gestione di nuove foto. Se applicabile. Accettabile
App complementare per dispositivo periferico. La funzione di base dell'app è mantenere una connessione permanente con il dispositivo periferico allo scopo di fornire l'accesso a internet della periferica. Se applicabile. Accettabile
L'app deve connettersi solo periodicamente a un dispositivo periferico per sincronizzarsi oppure deve connettersi solo a dispositivi, come cuffie wireless, collegati tramite profili Bluetooth standard. Se applicabile. Non accettabile