Ottimizza per sospensione e standby delle app

Android dispone di due funzionalità di risparmio energetico che consentono di prolungare la durata della batteria degli utenti gestendo il comportamento delle app quando un dispositivo non è collegato a una fonte di alimentazione: Sospensione e Sospensione app. La funzionalità Sospensione riduce il consumo della batteria differendo la CPU in background e l'attività di rete per le app quando il dispositivo rimane inutilizzato per lunghi periodi di tempo. La funzionalità App in attesa rimanda l'attività di rete in background per le app che non hanno attività utente recenti.

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

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

Informazioni sulla modalità 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 alla rete e ai servizi che richiedono un uso intensivo della CPU. Inoltre, impedisce alle app di accedere alla rete e rimanda i loro job, le sincronizzazioni e gli allarmi standard.

Periodicamente, il sistema chiude la modalità Sospensione per un breve periodo per consentire alle app di completare le attività differite. Durante questa finestra di manutenzione, il sistema esegue tutte le sincronizzazioni, i job e gli allarmi in attesa e consente alle app di accedere alla rete.

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

Al termine del periodo di manutenzione, il sistema attiva di nuovo la modalità Sospensione, sospendendo l'accesso alla rete e rinviando job, sincronizzazioni e allarmi. Nel tempo, il sistema pianifica le finestre di manutenzione meno frequentemente, 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 disattiva la modalità Sospensione e tutte le app riprenderanno la normale attività.

Limitazioni della modalità Sospensione

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

Elenco di controllo per la modalità Sospensione

Adatta la tua app a Sospensione

La modalità Sospensione può influire sulle app in modo diverso, a seconda delle funzionalità che offrono e dei servizi che utilizzano. Molte app funzionano normalmente durante i cicli di Sospensione senza modifiche. In alcuni casi, devi ottimizzare la modalità di gestione della rete, degli allarmi, dei job e delle sincronizzazioni da parte dell'app. Le app devono poter gestire in modo efficiente le attività durante ogni periodo di manutenzione.

Per 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 di Sospensione per l'accesso alla rete influisca anche sulla tua app, soprattutto se si basa su messaggi in tempo reale come solletico o notifiche. Se la tua app richiede una connessione permanente alla rete per ricevere messaggi, utilizza Firebase Cloud Messaging (FCM), se possibile.

Per verificare che la tua app funzioni come previsto con Sospensione, puoi utilizzare i comandi adb per forzare il sistema a attivare e uscire dalla modalità Sospensione e osservare il comportamento dell'app. Per maggiori dettagli, vedi Test con sospensione e standby delle app.

Informazioni sullo standby delle app

La modalità App in attesa consente al sistema di determinare che un'app è inattiva quando l'utente non la utilizza attivamente. Il sistema determina questa condizione quando 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 è in uso da un'altra attività o da un altro 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 e sincronizzazione in sospeso. Se il dispositivo è inattivo per lunghi periodi di tempo, il sistema consente alle app inattive di accedere alla rete circa una volta al giorno.

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

Firebase Cloud Messaging (FCM) è un servizio cloud-to-device che consente di supportare la messaggistica downstream in tempo reale tra app e servizi di backend sui dispositivi Android. FCM fornisce una singola connessione permanente al cloud. Tutte le app che necessitano di messaggistica in tempo reale possono condividere questa connessione. Questa connessione condivisa ottimizza notevolmente il consumo della batteria, rendendo inutile più app di mantenere le proprie connessioni permanenti separate, 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 la tua connessione di rete permanente.

FCM è ottimizzato per funzionare con le modalità inattive Doze e Standby delle app. I messaggi FCM con priorità elevata ti consentono di riattivare l'app per coinvolgere l'utente. In modalità Sospensione o Standby dell'app, il sistema invia il messaggio e concede all'app l'accesso temporaneo ai servizi di rete e wakelock parziali, quindi riporta il dispositivo o l'app allo stato di inattività. Per le notifiche visibili agli utenti e sensibili al tempo, valuta la possibilità di utilizzare messaggi ad alta priorità per abilitare la consegna in modalità di 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 comportano notifiche, ad esempio per 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 sul dispositivo non è attiva la modalità Sospensione. Se il dispositivo è in modalità Sospensione, gli avvisi vengono inviati durante i periodi di manutenzione periodi di sospensione o non appena l'utente riattiva il dispositivo.

Come best practice generale, se la tua app richiede la messaggistica a valle, 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.

Assistenza per altri casi d'uso

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

Un'app parzialmente esente può utilizzare la rete e mantenere wakelock parziali durante Sospensione e Standby app. Tuttavia, all'app vengono applicate altre limitazioni, come per le altre app. Ad esempio, i job e le sincronizzazioni dell'app vengono differiti per il livello API 23 e versioni precedenti e i normali avvisi AlarmManager non vengono attivati. Un'app può verificare se è attualmente nell'elenco di esenzioni chiamando il numero isIgnoringBatteryOptimizations().

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

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

Test con sospensione e standby delle app

Per garantire un'esperienza ottimale agli utenti, testa la tua app completamente in Sospensione e Standby delle app.

Testare l'app con Sospensione

Puoi testare la modalità Sospensione procedendo nel seguente modo:

  1. Configura un dispositivo hardware o virtuale con un'immagine di sistema Android 6.0 (livello API 23) o successive.
  2. Collega il dispositivo alla tua macchina di sviluppo e installa l'app.
  3. Esegui l'app e lasciala attiva.
  4. Forza il sistema in modalità di inattività eseguendo questo comando:
        $ adb shell dumpsys deviceidle force-idle
        
  5. Quando è tutto pronto, esci dalla modalità inattiva eseguendo il seguente 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 esegua correttamente il recupero quando il dispositivo esce dalla modalità Sospensione.

Testare l'app con Standby delle app

Per testare la modalità standby dell'app con la tua app, procedi nel seguente modo:

  1. Configura un dispositivo hardware o virtuale con un'immagine di sistema Android 6.0 (livello API 23) o successive.
  2. Collega il dispositivo alla tua macchina di sviluppo e installa l'app.
  3. Esegui l'app e lasciala attiva.
  4. Forza l'app in modalità App Standby eseguendo i seguenti comandi:
        $ adb shell dumpsys battery unplug
        $ adb shell am set-inactive <packageName> true
        
  5. Simula la riattivazione 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 si riprenda correttamente dalla modalità standby. In particolare, controlla se le notifiche e i job 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 è accettabile per le app utilizzare l'azione di intent ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS in queste situazioni. In generale, la tua app non soddisfa queste eccezioni, a meno che Sospensione o Standby dell'app non interrompa la funzione principale dell'app o non esista un motivo tecnico per cui l'app non può utilizzare messaggi ad alta priorità FCM.

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

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