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.
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:
- Sospendi l'accesso alla rete.
- Ignora i blocchi di riattivazione.
- Rimanda gli allarmi standard
AlarmManager
, tra cuisetExact()
esetWindow()
, al periodo di manutenzione successivo.- Se devi impostare sveglie che si attivano in modalità Sospensione, utilizza
setAndAllowWhileIdle()
osetExactAndAllowWhileIdle()
. - Le sveglie impostate con
setAlarmClock()
continuano ad attivarsi normalmente. Il sistema disattiva la modalità Sospensione poco prima dell'attivazione di questi allarmi.
- Se devi impostare sveglie che si attivano in modalità Sospensione, utilizza
- Non esegue ricerche di reti Wi-Fi.
- Non consente l'esecuzione degli adattatori di sincronizzazione.
- Non consente l'esecuzione di
JobScheduler
.
Elenco di controllo per la modalità Sospensione
- Se possibile, utilizza Firebase Cloud Messaging (FCM) per la messaggistica downstream.
- Se gli utenti devono visualizzare subito una notifica, usa un messaggio con priorità elevata FCM. Utilizza la priorità elevata solo per i messaggi che generano una notifica. Per ulteriori indicazioni, consulta la documentazione di FCM sulla priorità dei messaggi per Android.
- Fornisci informazioni sufficienti all'interno del payload del messaggio iniziale, in modo che l'accesso alla rete successivo non sia necessario.
- Imposta sveglie critiche con
setAndAllowWhileIdle()
esetExactAndAllowWhileIdle()
. - Testa l'app in 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:
- La maggior parte delle app può richiamare un intent che contiene
ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
. - Le app che soddisfano un caso d'uso accettabile
possono invece invocare un'intent che contiene l'azione di intent
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
per consentire all'utente di aggiungere l'app direttamente all'elenco delle esenzioni, senza accedere alle impostazioni di sistema.
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:
- Configura un dispositivo hardware o virtuale con un'immagine di sistema Android 6.0 (livello API 23) o successive.
- Collega il dispositivo alla tua macchina di sviluppo e installa l'app.
- Esegui l'app e lasciala attiva.
- Forza il sistema in modalità di inattività eseguendo questo comando:
$ adb shell dumpsys deviceidle force-idle
- Quando è tutto pronto, esci dalla modalità inattiva eseguendo il seguente comando:
$ adb shell dumpsys deviceidle unforce
- Riattiva il dispositivo eseguendo questo comando:
$ adb shell dumpsys battery reset
- 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:
- Configura un dispositivo hardware o virtuale con un'immagine di sistema Android 6.0 (livello API 23) o successive.
- Collega il dispositivo alla tua macchina di sviluppo e installa l'app.
- Esegui l'app e lasciala attiva.
- Forza l'app in modalità App Standby eseguendo i seguenti comandi:
$ adb shell dumpsys battery unplug $ adb shell am set-inactive <packageName> true
- Simula la riattivazione dell'app utilizzando i seguenti comandi:
$ adb shell am set-inactive <packageName> false $ adb shell am get-inactive <packageName>
- 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 |