Nel tentativo di ridurre il consumo energetico, Android 8.0 (livello API 26) limita la frequenza con cui un'app può recuperare la posizione attuale dell'utente mentre è in esecuzione in background. In queste condizioni, le app possono ricevere aggiornamenti sulla posizione solo alcune volte ogni ora.
Nota: queste limitazioni si applicano a tutte le app utilizzate sui dispositivi con Android 8.0 (livello API 26) o versioni successive, indipendentemente dalla versione dell'SDK target di un'app.
Questo comportamento di recupero della posizione è particolarmente importante da tenere presente se la tua app si basa su avvisi in tempo reale o sul rilevamento dei movimenti durante l'esecuzione in background.
Il comportamento delle app in primo piano viene mantenuto
Se un'app è in primo piano su un dispositivo con Android 8.0 (livello API 26), il comportamento di aggiornamento della posizione è lo stesso di Android 7.1.1 (livello API 25) e versioni precedenti.
Avviso: se la tua app recupera aggiornamenti della posizione quasi in tempo reale su un lungo periodo di tempo, la durata della batteria del dispositivo si riduce notevolmente.
Ottimizzare il comportamento della posizione dell'app
Valuta se i casi d'uso della tua app per l'esecuzione in background non possono essere completati se l'app riceve aggiornamenti della posizione in modo infrequente. In questo caso, puoi recuperare gli aggiornamenti della posizione più di frequente eseguendo una delle seguenti azioni:
- Porta l'app in primo piano.
-
Avvia un servizio in primo piano nella tua app chiamando
startForegroundService()
. Quando un servizio in primo piano è attivo, viene visualizzato come notifica in corso nell'area delle notifiche.Attenzione: se la tua app avvia un servizio in primo piano mentre è in esecuzione in background su un dispositivo con Android 11 (livello API 30) o versioni successive, non può accedere alle informazioni sulla posizione, a meno che l'utente non abbia concesso l'autorizzazione
ACCESS_BACKGROUND_LOCATION
alla tua app. Per saperne di più, consulta le indicazioni sulle limitazioni durante l'uso associate ai servizi in primo piano. -
Utilizza elementi dell'API Geofencing, come
GeofencingClient
, ottimizzati per ridurre al minimo il consumo di energia. - Utilizza un ascoltatore di posizione passivo, che potrebbe ricevere aggiornamenti sulla posizione più rapidi se ci sono app in primo piano che richiedono aggiornamenti sulla posizione a una frequenza maggiore.
Nota: se la tua app ha bisogno di accedere alla cronologia delle posizioni che contiene aggiornamenti frequenti, utilizza la versione raggruppata degli elementi dell'API Fused Location Provider, ad esempio l'interfaccia FusedLocationProviderApi
. Quando l'app è in esecuzione in background, questa API riceve la posizione dell'utente più di frequente rispetto all'API non in batch. Tieni presente, tuttavia, che la tua app riceve comunque aggiornamenti in batch solo alcune volte ogni ora.
API interessate
Le modifiche al comportamento di recupero della posizione nelle app in background interessano le seguenti API:
- Fused Location Provider (FLP)
-
-
Se l'app è in esecuzione in background, il servizio di sistema di geolocalizzazione calcola una nuova posizione per l'app solo alcune volte ogni ora. Ciò accade anche quando la tua app richiede aggiornamenti della posizione più frequenti.
Tuttavia, se utilizzi la versione batch di FLP, hai accesso a una cronologia della posizione più frequente nel tempo dopo che la tua app riceve un aggiornamento batch, che si verifica anche solo alcune volte ogni ora.
- Se la tua app è in esecuzione in primo piano, le frequenze di campionamento della posizione rimangono invariate rispetto ad Android 7.1.1 (livello API 25).
-
- Geofencing
-
- Le app in background possono ricevere eventi di transizione di geolocalizzazione più frequentemente rispetto agli aggiornamenti del fornitore di posizione combinato.
- La reattività media per un evento di geolocalizzazione è di circa ogni due minuti.
- Misurazioni GNSS e messaggi di navigazione GNSS
-
- Quando l'app è in background, i callback registrati per
ricevere output da
GnssMeasurement
eGnssNavigationMessage
smettono di essere eseguiti.
- Quando l'app è in background, i callback registrati per
ricevere output da
- Gestore della posizione
-
-
Gli aggiornamenti della posizione vengono forniti alle app in background solo alcune volte ogni ora.
Nota: se la tua app è in esecuzione su un dispositivo su cui è installato Google Play Services, ti consigliamo vivamente di utilizzare il Fornitore di posizione combinato (FLP).
-
- Gestore Wi-Fi
-
Il metodo
startScan()
esegue una ricerca completa delle app in background solo alcune volte ogni ora. Se un'app in background richiama di nuovo il metodo poco dopo, la classeWifiManager
fornisce i risultati memorizzati nella cache della scansione precedente.