Ottimizza per sospensione e standby delle app

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

Mentre il dispositivo è in modalità di sospensione, l'accesso delle app a determinate risorse che consumano molta batteria viene posticipato fino al periodo di manutenzione. Le limitazioni specifiche sono elencate in Limitazioni della gestione alimentazione.

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 target. Per garantire la migliore esperienza possibile agli utenti, testa la tua app nelle modalità di sospensione e di standby delle app e apporta le modifiche necessarie al codice. Le sezioni seguenti forniscono i dettagli.

Informazioni su Doze

Se un utente lascia un dispositivo scollegato e fermo per un periodo di tempo, con lo schermo spento, il dispositivo entra in modalità di sospensione. In modalità di 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 posticipa i job, le sincronizzazioni e le sveglie standard.

Periodicamente, il sistema esce dalla modalità di sospensione per un breve periodo di tempo per consentire alle app di completare le attività rimandate. Durante questo periodo 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. Doze fornisce un periodo di manutenzione ricorrente per le app per utilizzare la rete e gestire le attività in attesa.

Al termine del periodo di manutenzione, il sistema entra nuovamente in modalità Sospensione, sospendendo l'accesso alla rete e posticipando job, sincronizzazioni e sveglie. 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à di sospensione e tutte le app riprendono la normale attività.

Limitazioni di Doze

Il sistema applica le seguenti limitazioni alle tue app quando sono in modalità di sospensione:

Elenco di controllo per la modalità Sospensione

  • Se possibile, utilizza Firebase Cloud Messaging (FCM) per la messaggistica downstream.
  • Se gli utenti devono visualizzare immediatamente una notifica, utilizza il tipo di messaggio RemoteNotification. Per ulteriori indicazioni, consulta la documentazione di FCM sul tipo di messaggio RemoteNotification.
  • Fornisci informazioni sufficienti all'interno del payload del messaggio iniziale, in modo che l'accesso alla rete successivo non sia necessario.
  • Imposta allarmi critici con setAndAllowWhileIdle() e setExactAndAllowWhileIdle().
  • Testa l'app in modalità di sospensione.

Adatta l'app alla modalità Doze

Doze può influire sulle app in modo diverso, a seconda delle funzionalità che offrono e dei servizi che utilizzano. Molte app funzionano normalmente nei cicli di Doze senza modifiche. In alcuni casi, devi ottimizzare il modo in cui l'app gestisce la rete, le sveglie, i job e le sincronizzazioni. Le app devono essere in grado di gestire in modo efficiente le attività durante ogni periodo di manutenzione.

Per facilitare la programmazione delle sveglie, puoi utilizzare due metodi AlarmManager: setAndAllowWhileIdle() e setExactAndAllowWhileIdle(). Con questi metodi, puoi impostare sveglie che si attivano anche se il dispositivo è in modalità Sospensione.

Anche la limitazione di Doze sull'accesso alla rete potrebbe influire sulla tua app, soprattutto se si basa su messaggi in tempo reale come tickle 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 si comporti come previsto con la modalità Doze, puoi utilizzare i comandi adb per forzare l'attivazione e la disattivazione della modalità Doze da parte del sistema e osservare il comportamento della tua app. Per maggiori dettagli, consulta Test con Doze e Standby delle app.

Informazioni sulla modalità Standby delle app

La modalità Standby delle app consente al sistema di determinare che un'app è inattiva quando l'utente non la utilizza attivamente. Il sistema effettua questa determinazione 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 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 un alimentatore, il sistema rilascia le app dallo stato di standby, consentendo loro di accedere liberamente alla rete ed eseguire eventuali job e sincronizzazioni in attesa. Se il dispositivo rimane 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 la tua app mentre il dispositivo è inattivo

Firebase Cloud Messaging (FCM) è un servizio cloud-to-device che ti consente di supportare la messaggistica downstream in tempo reale tra i servizi di backend e le app sui dispositivi Android. FCM fornisce una singola connessione permanente al cloud. Tutte le app che richiedono la messaggistica in tempo reale possono condividere questa connessione. Questa connessione condivisa ottimizza in modo significativo il consumo della batteria, in quanto non è necessario che più app mantengano le proprie connessioni permanenti separate, il che può scaricare 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à di inattività Sospensione e Standby delle app. Il tipo di messaggio RemoteNotification di FCM ti consente di riattivare l'app per coinvolgere l'utente. In modalità Doze o Standby delle app, il sistema recapita 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 di inattività. Per le notifiche visibili agli utenti e urgenti, valuta la possibilità di utilizzare i tipi di messaggi RemoteNotification per consentire la consegna in modalità Doze. Questi messaggi possono generare notifiche. Per saperne di più, consulta le indicazioni di FCM su RemoteNotification.

Per i messaggi che non generano notifiche, ad esempio per mantenere aggiornati i contenuti dell'app in background o avviare sincronizzazioni dei dati, utilizza i messaggi FCM BackgroundSync. Questi messaggi hanno intenzionalmente una priorità bassa e potrebbero essere ritardati o limitati per ottimizzare la batteria del 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 RemoteNotification per i messaggi che generano notifiche rivolte agli utenti.

Non utilizzare RemoteNotification nelle seguenti situazioni:

  • Quando una notifica non verrà mostrata.
  • Per la consegna immediata di messaggi che aggiornano solo lo stato dell'app, ad esempio per mantenere aggiornati i contenuti dell'app in background o avviare sincronizzazioni dei dati.
  • Come mezzo per chiedere all'utente finale di concedere le autorizzazioni.

Supporto per altri casi d'uso

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

Un'app parzialmente esente può utilizzare la rete e mantenere wakelock parziali durante la modalità di sospensione e lo standby delle app. Tuttavia, all'app si applicano comunque altre limitazioni, proprio come per le altre app. Ad esempio, i job e le sincronizzazioni dell'app vengono posticipati sul livello API 23 e versioni precedenti e le sveglie AlarmManager regolari non vengono attivate. Un'app può verificare se è attualmente presente 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 fornisce alle app dei modi per chiedere agli utenti di esentarle:

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

Testa con Doze e Standby delle app

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

Testa l'app con Doze

Puoi testare la modalità Doze nel seguente modo:

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

Testa l'app con Standby delle app

Per testare la modalità Standby delle app con la tua app, segui questi passaggi:

  1. Configura un dispositivo hardware o virtuale con un'immagine di sistema Android 6.0 (livello API 23) o versioni successive.
  2. Collega il dispositivo alla macchina di sviluppo e installa l'app.
  3. Esegui l'app e lasciala attiva.
  4. Forza l'app in modalità Standby delle app eseguendo i seguenti comandi:
        $ adb shell dumpsys battery unplug
        $ adb shell am set-inactive <packageName> true
        
  5. Simula l'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 esca correttamente dalla modalità standby. In particolare, verifica se le notifiche e i job in background dell'app funzionano come previsto.

Casi d'uso accettabili per l'esenzione

La tabella seguente evidenzia diversi casi d'uso e se è accettabile che le app utilizzino l'azione di intent ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS in queste situazioni. In generale, la tua app non soddisfa queste eccezioni, a meno che Doze o Standby delle app non interrompa la funzionalità di base dell'app o non esista un motivo tecnico per cui la tua app non può utilizzare i messaggi FCM RemoteNotification.

Per saperne di più, consulta Supporto per altri casi d'uso.

Tipo Caso d'uso Può utilizzare FCM? Esenzione accettabile? Note
App di messaggistica immediata, chat o chiamate. Richiede l'invio di messaggi in tempo reale agli utenti mentre il dispositivo è in modalità Sospensione o l'app è in Standby delle app. Sì, utilizzando FCM Tipo non accettato Utilizza i messaggi FCM RemoteNotification per riattivare l'app e accedere alla rete.
Sì, ma non utilizza i messaggi FCM RemoteNotification.
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 o perché Doze e Standby delle app interrompono la funzionalità 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 funzionalità di base dell'app è la programmazione di azioni automatiche, ad esempio per la messaggistica immediata, le chiamate vocali o la gestione di nuove foto. Se applicabile. Accettabile
App complementare per dispositivi periferici. La funzione di base dell'app è mantenere una connessione permanente con il dispositivo periferico per fornire l'accesso a internet al dispositivo periferico. Se applicabile. Accettabile
L'app deve connettersi a un dispositivo periferico solo periodicamente per la sincronizzazione o deve connettersi solo a dispositivi, come le cuffie wireless, connessi tramite profili Bluetooth standard. Se applicabile. Tipo non accettato