Android ha due funzionalità di risparmio energetico che prolungano la durata della batteria per gli utenti gestione del 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 differendo Attività di rete e CPU in background per le app quando il dispositivo rimane inutilizzato per molto tempo diversi periodi di tempo. Lo standby dell'app ritarda l'attività di rete in background per app senza attività recente dell'utente.
Quando il dispositivo è in modalità Sospensione, le app l'accesso ad alcune funzionalità che consumano molta batteria le risorse vengono differite fino al periodo di manutenzione. Le restrizioni specifiche sono elencate in Gestione alimentazione limitazioni.
Sospensione e Standby delle app gestiscono il comportamento di tutte le app in esecuzione su Android 6.0 o superiore, indipendentemente dal fatto che abbiano come target il livello API 23. Per garantire un'esperienza ottimale agli utenti, testa la tua app in Sospensione e app modalità standby e apporta le modifiche necessarie al tuo codice. Le seguenti forniscono dettagli.
Informazioni su Sospensione
Se un utente lascia un dispositivo scollegato e fermo per un certo periodo di tempo, con lo schermo spento, il dispositivo entra in modalità di sospensione. In modalità di sospensione, il sistema tenta di per risparmiare batteria limitando le app accesso alla rete e a un uso intensivo della CPU i servizi di machine learning. Inoltre, impedisce alle app di accedere alla rete e ritarda la loro job, sincronizzazioni e sveglie standard.
Periodicamente, il sistema chiude la modalità Sospensione per un breve periodo per consentire il completamento delle app le loro attività differite. Durante questo periodo di manutenzione, esegue tutte le sincronizzazioni, i job e gli allarmi in sospeso e consente alle app di accedere alla rete.
![](https://developer.android.com/static/images/training/doze.png?authuser=0000&hl=it)
Al termine del periodo di manutenzione, il sistema attiva di nuovo la modalità Sospensione, sospendere l'accesso alla rete e rinviare job, sincronizzazioni e allarmi. Nel tempo, il sistema pianifica le finestre di manutenzione con minore frequenza, contribuendo a ridurre la 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 riprendono normalmente attività.
Limitazioni relative alla sospensione
Quando è attiva la modalità Sospensione, il sistema applica le seguenti limitazioni alle tue app:
- Sospendi l'accesso alla rete.
- Ignora sveglia lucchetti.
- Rimanda standard
AlarmManager
allarmi, tra cuisetExact()
esetWindow()
, al periodo di manutenzione successivo.- Se devi impostare sveglie che si attivano in modalità Sospensione, usa
setAndAllowWhileIdle()
osetExactAndAllowWhileIdle()
. - Sveglie impostate con
setAlarmClock()
continuano ad attivarsi normalmente. Il sistema esce dalla modalità Sospensione poco prima allarmi.
- Se devi impostare sveglie che si attivano in modalità Sospensione, usa
- Non esegue ricerche di reti Wi-Fi.
- Non consente l'esecuzione degli adattatore di sincronizzazione.
- Non consente
JobScheduler
vengono eseguiti tutti i test delle unità.
Elenco di controllo per la sospensione
- Se possibile, utilizza Firebase Cloud Messaging (FCM) per downstream di messaggistica.
- Se gli utenti devono visualizzare subito una notifica, utilizza un Messaggio con priorità elevata in FCM. Utilizza la priorità elevata solo per i messaggi che restituiscono in una notifica. Per ulteriori indicazioni, consulta FCM documentazione sulla priorità dei messaggi per Android.
- Fornisci informazioni sufficienti nel messaggio iniziale , quindi il successivo accesso alla rete non è necessario.
- Imposta sveglie critiche con
setAndAllowWhileIdle()
esetExactAndAllowWhileIdle()
. - Testa l'app in Sospensione.
Adatta la tua app a Sospensione
La sospensione può influire in modo diverso sulle app, a seconda delle funzionalità che offrono e ai servizi che utilizzano. Molte app funzionano normalmente durante i cicli di sospensione senza modifiche. In alcuni casi, devi ottimizzare il modo in cui l'app gestisce la rete, gli allarmi, i job e le sincronizzazioni. Le app devono poter gestire le attività durante ogni periodo di manutenzione.
Per facilitare la programmazione delle 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 Sospensione dell'accesso alla rete influisca anche sulla tua app, soprattutto 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 ricevi messaggi, utilizza Firebase Cloud Messaging (FCM) se possibile.
Per verificare che l'app funzioni come previsto con Sospensione, puoi utilizzare
adb
per forzare il sistema a entrare e uscire dalla modalità Sospensione e
osservare il comportamento dell'app. Per maggiori dettagli, vedi
Esegui test con Sospensione e Standby delle app.
Informazioni sullo standby delle app
Standby delle app consente al sistema di determinare se un'app è inattiva quando l'utente non lo è lo utilizzano attivamente. Il sistema determina quando l'utente non toccare l'app per un determinato periodo di tempo e per nessuna delle seguenti condizioni Si applica:
- L'utente avvia esplicitamente l'app.
- L'app ha un processo attualmente in primo piano, sotto forma di attività o in primo piano, oppure in uso da un'altra attività o da un servizio in primo piano.
- L'app genera una notifica che gli utenti vedono nella schermata di blocco o nelle 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 di job in attesa e sincronizzazioni. Se il dispositivo rimane inattivo per lunghi periodi di tempo, 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 Messaggistica (FCM) è un servizio cloud-to-device che consente di supportare in tempo reale messaggistica downstream tra app e servizi di backend sui dispositivi Android. FCM fornisce una singola connessione permanente al cloud. Tutte le app che richiedono la messaggistica in tempo reale può condividere questa connessione. Questa connessione condivisa ottimizza significativamente il consumo della batteria rendendola inutile per più app per mantenere le proprie connessioni permanenti separate, che possono esauriscono velocemente la batteria. Per questo motivo, se la tua app richiede la messaggistica integrazione con un servizio di backend, consigliamo vivamente di utilizzare FCM se piuttosto che mantenere la tua connessione di rete permanente.
FCM è ottimizzato per funzionare con le modalità di inattività Sospensione e Standby delle app. FCM i messaggi con priorità elevata ti consentono di riattivare l'app per coinvolgere l'utente. In modalità di sospensione o nell'app Modalità standby, il sistema invia il messaggio e concede all'app l'accesso temporaneo ai servizi di rete e wakelock parziali, quindi restituisce il dispositivo o l'app alla in stato di inattività. Per le notifiche sensibili al tempo e visibili agli utenti, valuta la possibilità di usare un messaggi prioritari per abilitare la pubblicazione in modalità Sospensione. I messaggi ad alta priorità possono generare notifiche. Consulta FCM istruzioni sui messaggi ad alta priorità.
Per i messaggi che non generano notifiche, ad esempio la conservazione dei contenuti dell'app aggiornate in background o di avvio di sincronizzazioni dei dati, usa FCM con priorità normale messaggi. I messaggi con priorità normale vengono recapitati immediatamente se il dispositivo non in modalità Sospensione. Se il dispositivo è in modalità Sospensione, questi vengono inviati durante il periodo periodico Sospendi i periodi di manutenzione o non appena l'utente riattiva il dispositivo.
Come best practice generale, se la tua app richiede messaggi downstream, usa in formato FCM. Se la tua app utilizza già FCM, assicurati che utilizzi messaggi ad alta priorità. solo per i messaggi che restituiscono notifiche rivolte agli utenti.
Assistenza per altri casi d'uso
Quasi tutte le app supportano la funzionalità Sospensione gestendo la connettività di rete, di sveglie, job e sincronizzazioni, nonché utilizzando i messaggi FCM. Per un utilizzo limitato in alcuni casi potrebbe non essere sufficiente. In questi casi, il sistema fornisce elenco configurabile di app parzialmente esenti da Sospensione e Standby delle app ottimizzazioni.
Un'app parzialmente esente può utilizzare la rete e mantenere una funzionalità di riattivazione parziale
si bloccano durante la sospensione e lo standby delle app. Tuttavia, valgono altre limitazioni
all'app, proprio come accade con altre app. Ad esempio, i job e la sincronizzazione dell'app
sono differite per il livello API 23 e inferiori e le sue regolari
AlarmManager
sveglie non si attivano. Un'app può controllare se si tratta di
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 fornisce 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
. - App che soddisfano un caso d'uso accettabile
può invece richiamare un intent che contiene
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
un'azione di intent per consentire all'utente di aggiungere direttamente l'app all'elenco di esenzioni senza andare alle impostazioni di sistema.
Un'app può verificare se è attualmente nell'elenco di esenzioni chiamando
isIgnoringBatteryOptimizations()
.
Esegui 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:
- Configurare un dispositivo hardware o virtuale con un sistema operativo Android 6.0 (API livello 23) o superiore.
- Collega il dispositivo al computer 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 questo 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. Marca 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:
- Configurare un dispositivo hardware o virtuale con un sistema operativo Android 6.0 (API livello 23) o superiore.
- Collega il dispositivo al computer di sviluppo e installa l'app.
- Esegui l'app e lasciala attiva.
- Forza l'app in modalità standby dell'app eseguendo questi 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 esegue regolarmente il ripristino dalla modalità standby. In particolare, controlla se le notifiche e i job in background funzionano come previsto.
Casi d'uso accettabili per l'esenzione
La tabella seguente evidenzia diversi casi d'uso e indica se è accettabile
per consentire alle app di usare ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
in queste situazioni. In generale, la tua app non soddisfa questi
eccezioni, a meno che Sospensione o Standby dell'app interrompa la funzione principale dell'app o
esiste un motivo tecnico per cui la tua app non può usare FCM ad alta priorità
messaggi.
Per ulteriori informazioni, vedi Assistenza per e altri casi d'uso.
Tipo | Caso d'uso | Posso utilizzare FCM? | È accettata l'esenzione? | Note |
---|---|---|---|---|
App di messaggistica, chat o chiamata istantanea. | Richiede la consegna di messaggi in tempo reale agli utenti, Il dispositivo è in modalità di sospensione o l'app è in standby delle app. | Sì, utilizzando FCM | Non accettabile | Utilizza i messaggi FCM con priorità elevata per riattivare l'app e accedere in rete. |
Sì, ma non utilizza messaggi FCM ad alta priorità. | ||||
App di messaggistica, chat o chiamate istantanei. le app VOIP aziendali. | No, non è possibile utilizzare FCM a causa di una dipendenza tecnica da un altro messaggio o Sospensione e standby dell'app interrompono la funzione principale dell'app. | Accettabile | ||
App Emergenze. | App che proteggono i loro utenti e le loro famiglie. | Se applicabile. | Accettabile | |
App per l'automazione delle attività. | La funzione principale dell'app è la pianificazione di azioni automatiche, ad esempio la pianificazione di azioni istantanee i messaggi, le chiamate vocali o la nuova gestione delle foto. | Se applicabile. | Accettabile | |
App complementare del dispositivo periferico. | La funzione principale dell'app è mantenere una connessione permanente con dispositivo periferico allo scopo di fornire il dispositivo accesso a internet. | Se applicabile. | Accettabile | |
L'app deve connettersi periodicamente a un dispositivo periferico per eseguire la sincronizzazione o deve connettersi solo a dispositivi, ad esempio cuffie wireless, connessi tramite profili Bluetooth standard. | Se applicabile. | Non accettabile |