Ottimizza posizione per batteria

La posizione in background Limiti introdotti in Android 8.0 (livello API 26) ha rinnovato il tema l'utilizzo dei servizi di localizzazione influisce sul consumo della batteria. Questa pagina si rivolge ad alcune località best practice per i servizi di Google e cosa puoi fare ora per aumentare la durata della batteria delle tue app in modo efficace. L'applicazione di queste best practice comporta vantaggi per la tua app indipendentemente dal e la versione della piattaforma su cui è in esecuzione.

I limiti per la posizione in background in Android 8.0 hanno introdotto le seguenti modifiche:

  • La raccolta della posizione in background è limitata, viene calcolata la posizione e solo poche volte all'ora.
  • Le ricerche di reti Wi-Fi sono più conservative e gli aggiornamenti della posizione non vengono calcolati quando il dispositivo rimane connesso allo stesso access point statico.
  • La reattività del geofencing passa da decine di secondi a circa due minuti. Questa modifica migliora notevolmente le prestazioni della batteria, fino a 10 volte migliore su alcuni dispositivi.

Questa pagina presuppone che tu stia utilizzando i Servizi di geolocalizzazione di Google API, che offrono una maggiore precisione comportano un carico sulla batteria più leggero rispetto al luogo della struttura di terze parti. Nella specifica, questa pagina presuppone che tu abbia familiarità con il fornitore di servizi di localizzazione dell'API, che combina i segnali di reti GPS, Wi-Fi e cellulari, nonché accelerometro, giroscopio, magnetometro e altri sensori. Dovresti inoltre essere familiarità con il geofencing all'API, che è stata creata in aggiunta all'API Fused Location Provider, ed è ottimizzato per la batteria le prestazioni dei dispositivi.

Informazioni sul consumo della batteria

La raccolta della posizione e il consumo della batteria sono direttamente correlati a quanto segue: aspetti:

  • Precisione: la precisione dei dati sulla posizione. In generale, più alto è il valore precisione, maggiore è il consumo della batteria.
  • Frequenza: frequenza con cui viene calcolata la posizione. La posizione più frequente è viene sempre calcolata, maggiore è l'utilizzo della batteria.
  • Latenza: la velocità di invio dei dati sulla posizione. Minore latenza di solito richiede più batteria.

Accuratezza

Puoi specificare la precisione della geolocalizzazione utilizzando il setPriority() , passando uno dei seguenti valori come argomento:

  • PRIORITY_HIGH_ACCURACY fornisce la posizione più precisa possibile, che viene calcolata utilizzando molti input se necessario (abilita GPS, Wi-Fi e cellulare e utilizza una varietà di sensori) e potrebbero causare un consumo eccessivo della batteria.
  • PRIORITY_BALANCED_POWER_ACCURACY fornisce una posizione precisa, ottimizzando al contempo la potenza. Usa molto raramente GPS. In genere utilizza una combinazione di informazioni sulla rete Wi-Fi e sulla rete mobile per calcolare posizione del dispositivo.
  • PRIORITY_LOW_POWER fa affidamento in gran parte su torri cellulari ed evita gli ingressi GPS e Wi-Fi, fornendo precisione approssimativa (a livello di città) con un consumo minimo della batteria.
  • PRIORITY_NO_POWER riceve passivamente le posizioni da altre app per le quali la posizione è già stata calcolata.

Le esigenze di geolocalizzazione della maggior parte delle app possono essere soddisfatte usando la potenza bilanciata o la batteria bassa opzioni di alimentazione. L'alta precisione deve essere riservata alle app in esecuzione in primo piano e richiedono aggiornamenti della posizione in tempo reale (ad esempio, una mappatura app).

Frequenza

Puoi specificare la frequenza della posizione utilizzando due metodi:

  • Utilizza la setinterval() per specificare l'intervallo con cui viene calcolata la posizione per la tua app.
  • Utilizza la setFastestInterval() per specificare l'intervallo a cui viene calcolata la posizione per le altre app disponibili nella tua app.

Devi passare il valore più alto possibile quando utilizzi setInterval(). Questo è particolarmente vero per la raccolta della posizione in background, che è spesso una fonte di consumo indesiderato della batteria. L'utilizzo di intervalli di pochi secondi deve essere riservato e i casi d'uso in primo piano. I limiti per la posizione in background introdotti in Android 8.0 applicare queste strategie, ma la tua app dovrebbe cercare di applicarle su Android 7.0 o versioni precedenti.

Latenza

Puoi specificare la latenza utilizzando setMaxWaitTime() , in genere trasmettendo un valore diverse volte più grande dell'intervallo specificato nel setInterval() . Questa impostazione ritarda la consegna della posizione e potrebbero essere disponibili più aggiornamenti della posizione da distribuire in batch. Queste due modifiche aiutano a ridurre al minimo il consumo della batteria.

Se la tua app non ha bisogno immediatamente di un aggiornamento della posizione, devi trasmettere il il valore più alto possibile al metodo setMaxWaitTime(), scambiando effettivamente per ottenere più dati e aumentare l'efficienza della batteria.

Quando utilizzi i recinti virtuali, le app devono trasmettere un grande valore alla setNotificationResponsiveness() per preservare l'energia. Si consiglia un valore di almeno 5 minuti.

Casi d'uso relativi alla posizione

Questa sezione descrive alcuni scenari tipici di raccolta della posizione, oltre a Consigli per un utilizzo ottimale del geofencing e del fornitore della posizione incorporata su quelle di livello inferiore.

Aggiornamenti visibili all'utente o in primo piano

Esempio: un'app di mappatura che richiede aggiornamenti frequenti e accurati con un una latenza di pochi millisecondi. Tutti gli aggiornamenti avvengono in primo piano: l'utente avvia un'attività, consuma i dati sulla posizione e quindi interrompe l'attività dopo un breve lasso di tempo.

Utilizza la setPriority() con il valore PRIORITY_HIGH_ACCURACY o PRIORITY_BALANCED_POWER_ACCURACY

L'intervallo specificato nel setInterval() dipende dal caso d'uso: per gli scenari in tempo reale, imposta il valore su pochi seconds; In caso contrario, limitalo a pochi minuti (circa 2 minuti oppure si consiglia di aumentarlo per ridurre al minimo l'utilizzo della batteria).

Conoscere la posizione del dispositivo

Esempio: un'app meteo vuole conoscere la posizione del dispositivo.

Utilizza la getLastLocation() , che restituisce la posizione più recente disponibile (che in rari casi casi possono essere nulli) . Questo metodo offre un modo semplice per rilevare la posizione non comporta costi associati alla richiesta attiva di aggiornamenti della posizione. Utilizza le funzionalità di in concomitanza con isLocationAvailable() che restituisce true quando la posizione restituita da getLastLocation() è ragionevolmente aggiornata.

Avvio di aggiornamenti quando un utente si trova in una località specifica

Esempio: richiedere aggiornamenti quando un utente si trova entro una certa distanza da lavoro, casa o un altro luogo.

Utilizza il geofencing insieme alla del fornitore di servizi di localizzazione. Richiedere aggiornamenti quando l'app riceve un recinto virtuale trigger di ingresso e rimuovere gli aggiornamenti quando l'app riceve un'uscita dal recinto virtuale trigger. In questo modo l'app riceve aggiornamenti della posizione più granulari solo quando l'utente è entrato in un'area definita.

Il flusso di lavoro tipico per questo scenario potrebbe prevedere l'invio di una notifica al momento della transizione del recinto virtuale e l'avvio di un'attività che contiene per richiedere aggiornamenti quando l'utente tocca la notifica.

Avvio degli aggiornamenti in base allo stato dell'attività dell'utente

Esempio: richiedere aggiornamenti solo quando l'utente sta guidando o guidando bicicletta.

Utilizzare la funzionalità Riconoscimento attività dell'API in in concomitanza con gli aggiornamenti del fornitore di servizi di localizzazione. Richiedi aggiornamenti quando rilevata un'attività mirata e rimuove gli aggiornamenti quando l'utente smette di dello svolgimento dell'attività in questione.

Il flusso di lavoro tipico per questo caso d'uso potrebbe prevedere la visualizzazione di una notifica per l'attività rilevata e l'avvio di un'attività che contiene il codice per richiedere aggiornamenti quando l'utente tocca la notifica.

Aggiornamenti a lungo termine della posizione in background relativi ad aree geografiche

Esempio: l'utente vuole ricevere una notifica quando il dispositivo si trova nelle vicinanze di un rivenditore.

Questo è un caso d'uso eccellente per il geofencing. Perché il caso d'uso quasi comporta sicuramente la posizione in background, addGeofences(GeofencingRequest, PendingIntent) .

Devi impostare le seguenti opzioni di configurazione:

  • Se stai monitorando le transizioni di attesa, utilizza il metodo setLoiteringDelay() che trasmette un valore di circa cinque minuti o meno.

  • Utilizza la setNotificationResponsiveness(), passando un valore di circa cinque minuti. Tuttavia, valuta l'utilizzo di un valore di dieci minuti circa se l'app è in grado di gestire il ritardo aggiuntivo la reattività.

Un'app può registrare solo un massimo di 100 recinti virtuali alla volta. Durante un uso nel caso in cui un'app voglia monitorare un gran numero di opzioni di rivenditori, potresti voler registrare un recinto virtuale di grandi dimensioni (a livello di città) e registrare recinti virtuali più piccoli (per le sedi all'interno della città) per i negozi all'interno del recinto virtuale più grande. Quando un utente entra in un recinto virtuale di grandi dimensioni, possono essere essere aggiunti. quando l'utente esce dal recinto virtuale più grande, più piccoli potranno rimuovere e registrare nuovamente i recinti virtuali per una nuova area.

Aggiornamenti della posizione in background a lunga esecuzione senza un componente dell'app visibile

Esempio: un'app che monitora passivamente la posizione

Utilizza la setPriority() con il PRIORITY_NO_POWER perché non consuma quasi completamente la batteria. Se utilizzi PRIORITY_NO_POWER non è possibile, utilizza PRIORITY_BALANCED_POWER_ACCURACY o PRIORITY_LOW_POWER, ma evita di usare PRIORITY_HIGH_ACCURACY per un lavoro in background duraturo perché questa opzione svuota molto batteria.

Se hai bisogno di più dati sulla posizione, utilizza la posizione passiva chiamando il setFastestInterval() di fornire un valore più basso di quello trasmesso setInterval(). Quando combinata con PRIORITY_NO_POWER la posizione passiva può distribuire in modo opportunistico una posizione calcolata altre app senza costi aggiuntivi.

Moderare la frequenza aggiungendo un po' di latenza, utilizzando setMaxWaitTime() . Ad esempio, se utilizzi il metodo setinterval() con il valore circa 10 minuti, dovresti considerare di chiamare setMaxWaitTime() con un valore compreso tra 30 e 60 minuti. Con queste opzioni, viene calcolata la posizione dell'app ogni 10 minuti circa, ma quest'ultima viene riattivata ogni 30-60 minuti con alcuni dati sulla posizione disponibili come aggiornamento batch. Questo scambia la latenza con più dati disponibili e una batteria migliore le prestazioni dei dispositivi.

Aggiornamenti frequenti e ad alta precisione durante l'interazione dell'utente con altre app

Esempio: un'app di navigazione o per l'attività fisica che continua a funzionare quando l'utente spegne lo schermo o apre un'altra app.

Utilizzare un servizio in primo piano. Se il lavoro è potenzialmente costoso dalla tua app per conto dell'utente, informando l'utente di questo lavoro è una la best practice consigliata. Un servizio in primo piano richiede un'istanza notifica. Per ulteriori informazioni, vedi Notifiche Panoramica.

Best practice per la posizione

L'implementazione delle best practice in questa sezione consente di ridurre l'utilizzo della batteria di la tua app.

Rimuovere aggiornamenti posizione

Una causa comune di consumo eccessivo della batteria è la mancata rimozione della posizione. quando non sono più necessari. Questo può accadere, ad esempio, quando dell'attività onStart() o Ciclo di vita di onResume() contengono una chiamata a requestlocationUpdates() senza una chiamata corrispondente a removeLocationUpdates() onPause() o onStop() metodi del ciclo di vita.

Puoi utilizzare componenti sensibili al ciclo di vita per gestire meglio attività nella tua app. Per ulteriori informazioni, consulta Gestione dei cicli di vita con componenti sensibili al ciclo di vita.

Imposta timeout

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

Per una richiesta del provider di località fusa, aggiungi un timeout chiamando setExpirationDuration(), che riceve un parametro che rappresenta il tempo in millisecondi a partire dalla è stato chiamato l'ultima volta. Puoi anche aggiungere un timeout chiamando setExpirationTime(), che riceve un parametro che rappresenta la scadenza in millisecondi dall'ultimo avvio del sistema.

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

Richieste batch

Per tutti i casi d'uso non in primo piano, raggruppa più richieste in batch. Puoi utilizzare il setInterval() per specificare l'intervallo in base al quale calcolare la località. Poi utilizza setMaxWaitTime() per impostare l'intervallo di tempo a cui la località viene pubblicata nella tua app. La il valore trasmesso al metodo setMaxWaitTime() deve essere un multiplo del valore passato al metodo setInterval(). Ad esempio, considera quanto segue: 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, la posizione viene calcolata all'incirca ogni dieci minuti e circa vengono distribuiti sei punti dati di sedi in un batch circa ogni ora. Anche se continui a ricevere aggiornamenti sulla posizione ogni 10 minuti circa, risparmi perché il dispositivo viene svegliato soltanto ogni ora circa.

Usare gli aggiornamenti della posizione passivi

Nei casi d'uso in background, è una buona idea limitare gli aggiornamenti della posizione. Android I limiti 8.0 prevedono l'applicazione di questa pratica, ma le app in esecuzione su dispositivi meno recenti dovrebbero cerca di limitare il più possibile la posizione in background.

È probabile che mentre la tua app è in background, un'altra app possa essere che richiedono spesso aggiornamenti della posizione in primo piano. Servizi di localizzazione rende disponibili questi aggiornamenti alla tua app. Considera la seguente posizione , che consuma opportunisticamente 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 viene calcolata per la tua app circa ogni 15 minuti. Se altre app richiedono la posizione, i dati vengono resi disponibili per la tua app a un intervallo massimo di 2 minuti.

Anche se l'uso passivo della posizione non comporta un consumo eccessivo della batteria, presta particolare attenzione casi in cui la ricezione dei dati sulla posizione attiva CPU o I/O costose operazioni. Per ridurre al minimo i costi della batteria, l'intervallo specificato in setFastestInterval() non deve essere troppo piccolo.

Puoi migliorare notevolmente le prestazioni della batteria dei tuoi utenti dispositivi per seguendo i consigli in questa pagina. È meno probabile che i tuoi utenti eliminino di app che non consumano la batteria.