Ottimizzare l'utilizzo della posizione per la durata della batteria

Svolgi le seguenti azioni per migliorare l'impatto della tua app sulla durata della batteria di un dispositivo quando utilizzi i servizi di geolocalizzazione.

Rimuovere gli aggiornamenti sulla posizione

Una causa comune di consumo eccessivo della batteria è la mancata rimozione degli aggiornamenti della posizione quando non sono più necessari.

Questo può accadere quando i metodi di ciclo di vita onStart() o onResume() di un'attività contengono una chiamata a requestlocationUpdates() senza una chiamata corrispondente a removeLocationUpdates() nei metodi di ciclo di vita onPause() o onStop().

Puoi utilizzare i componenti consapevoli del ciclo di vita per gestire meglio il ciclo di vita delle attività nella tua app. Per saperne di più, consulta la sezione Gestire i cicli di vita con i componenti consapevoli del ciclo di vita.

Impostare i timeout

Per evitare il consumo della batteria, imposta un timeout ragionevole per l'interruzione degli aggiornamenti della posizione. Il timeout garantisce che gli aggiornamenti non continuino a tempo indeterminato e protegge l'app in scenari in cui gli aggiornamenti vengono richiesti, ma non rimossi (ad esempio a causa di un bug nel codice).

Per una richiesta di fornitori di servizi di geolocalizzazione combinati, aggiungi un timeout chiamando setExpirationDuration(), che riceve un parametro che rappresenta il tempo in millisecondi dall'ultima chiamata del metodo. Puoi anche aggiungere un timeout chiamando setExpirationTime(), che riceve un parametro che rappresenta il tempo di scadenza in millisecondi dall'ultimo avvio del sistema.

Per aggiungere un timeout a una richiesta di posizione del recinto virtuale, chiama il metodo setExpirationDuration().

Richieste batch

Per tutti i casi d'uso in background, raggruppa più richieste. Utilizza il metodo setInterval() per specificare l'intervallo in cui vuoi che venga calcolata la posizione. Quindi, utilizza il metodo setMaxWaitTime() per impostare l'intervallo in cui la posizione viene inviata alla tua app. Passa un valore al metodo setMaxWaitTime() che sia un multiplo del valore passato al metodo setInterval(). Ad esempio, considera la seguente richiesta di posizione:

Kotlin

val request = LocationRequest()
request.setInterval(10 * 60 * 1000)
request.setMaxWaitTime(60 * 60 * 1000)

Java

LocationRequest request = new LocationRequest();
request.setInterval(10 * 60 * 1000);
request.setMaxWaitTime(60 * 60 * 1000);

In questo caso, il sistema calcola la posizione ogni circa dieci minuti e fornisce circa sei punti dati sulla posizione in un batch ogni circa un'ora. Anche se continui a ricevere aggiornamenti sulla posizione ogni dieci minuti circa, risparmi la batteria perché il dispositivo si riattiva solo ogni ora circa.

Utilizzare gli aggiornamenti della posizione passivi

Nei casi d'uso in background, è consigliabile limitare gli aggiornamenti della posizione. I limiti di Android 8.0 (livello API 26) applicano questa pratica, ma le app in esecuzione su dispositivi meno recenti devono cercare di limitare il più possibile l'accesso alla posizione in background.

È probabile che, mentre la tua app è in background, un'altra app possa richiedere spesso aggiornamenti della posizione in primo piano. I servizi di geolocalizzazione rendono disponibili questi aggiornamenti per la tua app. Prendi in considerazione la seguente richiesta di accesso alla posizione, che utilizza opportunisticamente i dati sulla posizione:

Kotlin

val request = LocationRequest()
request.setInterval(15 * 60 * 1000)
request.setFastestInterval(2 * 60 * 1000)

Java

LocationRequest request = new LocationRequest();
request.setInterval(15 * 60 * 1000);
request.setFastestInterval(2 * 60 * 1000);

Nell'esempio precedente, la posizione dell'app viene calcolata approssimativamente ogni 15 minuti. Se altre app richiedono la posizione, l'app riceve i dati con un intervallo massimo di due minuti.

Anche se l'utilizzo passivo della posizione non comporta un consumo della batteria, fai molta attenzione nei casi in cui la ricezione dei dati sulla posizione attivi operazioni di I/O o CPU costose. Per ridurre al minimo i costi della batteria, l'intervallo specificato in setFastestInterval() non deve essere troppo ridotto.