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.
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:
- Sospende l'accesso alla rete.
- Ignora i blocchi di riattivazione.
- Rimanda gli allarmi standard
AlarmManager
, inclusisetExact()
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 a attivarsi normalmente. Il sistema esce dalla modalità Sospensione poco prima dell'attivazione di questi rilevatori.
- 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 sospensione
- Se possibile, utilizza Firebase Cloud Messaging (FCM) per la messaggistica downstream.
- Se gli utenti devono visualizzare subito una notifica, utilizza un messaggio FCM ad alta priorità. Utilizza la priorità alta 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 dei messaggi iniziale, in modo che il successivo accesso alla rete non sia necessario.
- Imposta sveglie critiche con
setAndAllowWhileIdle()
esetExactAndAllowWhileIdle()
. - Testa l'app in modalità 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:
- 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 richiamare un intent che contiene l'azione intent
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
per consentire all'utente di aggiungere l'app direttamente all'elenco di esenzioni, senza andare alle impostazioni di sistema.
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:
- Configura un dispositivo hardware o un dispositivo virtuale con un'immagine di sistema Android 6.0 (livello API 23) o versioni successive.
- Collega il dispositivo al computer di sviluppo e installa l'app.
- Esegui l'app e lasciala attiva.
- Forza la modalità di inattività del sistema 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. 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:
- Configura un dispositivo hardware o un dispositivo virtuale con un'immagine di sistema Android 6.0 (livello API 23) o versioni successive.
- Collega il dispositivo al computer di sviluppo e installa l'app.
- Esegui l'app e lasciala attiva.
- 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
- Simula il attivazione 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 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 |