Esegui le seguenti azioni per migliorare l'impatto della tua app sulla durata della batteria di un dispositivo quando utilizzi i servizi di localizzazione.
Rimuovere gli aggiornamenti della posizione
Una fonte comune di consumo eccessivo della batteria è la mancata rimozione degli aggiornamenti della posizione quando non sono più necessari.
Ciò può accadere quando i metodi del ciclo di vita onStart() o onResume()
contengono una chiamata a requestlocationUpdates() senza una
chiamata corrispondente a removeLocationUpdates() nei metodi del ciclo di vita onPause() o
onStop().
Puoi utilizzare i componenti che tengono conto del ciclo di vita per gestire meglio il ciclo di vita delle attività nella tua app. Per ulteriori informazioni, consulta Gestire i cicli di vita con i componenti che tengono conto del ciclo di vita.
Impostare i timeout
Per evitare il consumo eccessivo della batteria, imposta un timeout ragionevole per quando gli aggiornamenti della posizione devono essere interrotti. Il timeout garantisce che gli aggiornamenti non continuino all'infinito e protegge l'app negli scenari in cui gli aggiornamenti vengono richiesti ma non rimossi (ad esempio, a causa di un bug nel codice).
Per una richiesta di Fused Location Provider, aggiungi un timeout chiamando
setDurationMillis(), che riceve un parametro che rappresenta il
tempo in millisecondi dall'ultima chiamata del metodo. Puoi anche utilizzare il metodo per esprimere il tempo di scadenza in termini di durata.
Per aggiungere un timeout a una richiesta di posizione del recinto virtuale, chiama il
setExpirationDuration() metodo.
Richieste batch
Per tutti i casi d'uso non in primo piano, raggruppa più richieste. Utilizza il
setIntervalMillis() metodo per specificare l'intervallo in cui vuoi che venga calcolata la
posizione. Poi, utilizza il metodo setMaxUpdateDelayMillis() per impostare
l'intervallo in cui la posizione viene fornita alla tua app. Passa un valore al
setMaxUpdateDelayMillis() metodo che sia un multiplo del valore passato al
setIntervalMillis() metodo. Ad esempio, considera la seguente richiesta di posizione:
Kotlin
val request = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10 * 60 * 1000)
.setMaxUpdateDelayMillis(60 * 60 * 1000)
.build()
Java
LocationRequest request = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10 * 60 * 1000)
.setMaxUpdateDelayMillis(60 * 60 * 1000)
.build();
In questo caso, il sistema calcola la posizione all'incirca ogni dieci minuti e fornisce circa sei punti dati sulla posizione in un batch all'incirca ogni ora. Anche se continui a ricevere aggiornamenti della posizione ogni dieci minuti circa, risparmi batteria perché il dispositivo si riattiva solo ogni ora circa.
Utilizzare gli aggiornamenti della posizione passivi
Nei casi d'uso in background, è una buona idea limitare gli aggiornamenti della posizione. I limiti di Android 8.0 (livello API 26) impongono questa pratica, ma le app in esecuzione su dispositivi di livello inferiore devono cercare di limitare il più possibile la posizione in background.
È probabile che, mentre la tua app è in background, un'altra app possa richiedere frequentemente aggiornamenti della posizione in primo piano. I servizi di localizzazione rendono disponibili questi aggiornamenti alla tua app. Considera la seguente richiesta di posizione, che utilizza in modo opportunistico i dati sulla posizione:
Kotlin
val request = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 15 * 60 * 1000)
.setMinUpdateIntervalMillis(2 * 60 * 1000)
.build()
Java
LocationRequest request = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 15 * 60 * 1000)
.setMinUpdateIntervalMillis(2 * 60 * 1000)
.build();
Nell'esempio precedente, la posizione dell'app viene calcolata all'incirca ogni 15 minuti. Se altre app richiedono la posizione, l'app riceve i dati con un intervallo massimo di due minuti.
Sebbene l'utilizzo passivo della posizione non comporti un consumo eccessivo della batteria, presta particolare attenzione nei casi in cui la ricezione dei dati sulla posizione attiva operazioni di I/O o della CPU costose. Per ridurre al minimo i costi della batteria, l'intervallo specificato in
setMinUpdateIntervalMillis() non deve essere troppo breve.