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 l'app è in esecuzione in background. In queste condizioni, le app possono ricevere aggiornamenti sulla posizione solo poche volte all'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 dell'app.
Questo comportamento di recupero della posizione è particolarmente importante da tenere presente se la tua app si basa su avvisi in tempo reale o rilevamento di movimenti durante l'esecuzione in background.
Il comportamento dell'app in primo piano viene mantenuto
Se un'app è in primo piano su un dispositivo con Android 8.0 (livello API 26), il comportamento dell'aggiornamento della posizione è lo stesso di Android 7.1.1 (livello API 25) e versioni precedenti.
Avviso:se l'app recupera aggiornamenti della posizione quasi in tempo reale per 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 avere successo se l'app riceve aggiornamenti della posizione non frequenti. In questo caso, puoi recuperare gli aggiornamenti della posizione con maggiore frequenza eseguendo una delle seguenti azioni:
- Porta la tua app in primo piano.
-
Avvia un servizio in primo piano nella tua app chiamando
startForegroundService()
. Quando un servizio in primo piano di questo tipo è attivo, viene visualizzata come notifica continua nell'area di notifica.Attenzione:se l'app avvia un servizio in primo piano mentre è in esecuzione in background su un dispositivo con Android 11 (livello API 30) o versioni successive, l'app non può accedere alle informazioni sulla posizione a meno che l'utente non abbia concesso l'autorizzazione
ACCESS_BACKGROUND_LOCATION
per l'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. - Usa un listener di posizione passivo, che potrebbe ricevere aggiornamenti della posizione più rapidamente se ci sono app in primo piano che richiedono aggiornamenti della posizione a una velocità maggiore.
Nota: se la tua app ha bisogno di accedere a una cronologia delle posizioni che contiene aggiornamenti con frequenza temporale, utilizza la versione in batch degli elementi dell'API Fused Location Provider, ad esempio l'interfaccia FusedLocationProviderApi
. Quando la tua app è in esecuzione in background, questa API riceve la posizione dell'utente più spesso rispetto all'API non in batch. Tieni presente, tuttavia, che la tua app riceve comunque gli aggiornamenti in batch solo poche volte all'ora.
API interessate
Le modifiche al comportamento di recupero della posizione nelle app in background influiscono sulle seguenti API:
- Fused Location Provider (FLP)
-
-
Se la tua app è in esecuzione in background, il servizio del sistema di geolocalizzazione calcola una nuova posizione per la tua app solo poche volte all'ora. Questo è il caso anche quando la tua app richiede aggiornamenti della posizione più frequenti.
Se utilizzi la versione in batch di FLP, tuttavia, hai accesso a una cronologia delle posizioni più frequente dopo che l'app riceve un aggiornamento batch, cosa che viene eseguita solo poche volte ogni ora.
- Se la tua app è in esecuzione in primo piano, non ci sono modifiche alle frequenze di campionamento delle località rispetto ad Android 7.1.1 (livello API 25).
-
- Geofencing
-
- Le app in background possono ricevere eventi di transizione per il geofencing più spesso rispetto agli aggiornamenti del Fused Location Provider.
- La reattività media per un evento di geofencing è ogni due minuti circa.
- Misurazioni GNSS e messaggi di navigazione GNSS
-
- Quando l'app è in background, l'esecuzione dei callback registrati per ricevere output da
GnssMeasurement
eGnssNavigationMessage
viene interrotta.
- Quando l'app è in background, l'esecuzione dei callback registrati per ricevere output da
- Gestione indirizzi
-
-
Gli aggiornamenti della posizione vengono forniti alle app in background solo poche volte all'ora.
Nota: se la tua app è in esecuzione su un dispositivo su cui è installato Google Play Services, ti consigliamo vivamente di utilizzare Fused Location Provider (FLP).
-
- Gestione Wi-Fi
-
Il metodo
startScan()
esegue una scansione completa delle app in background solo poche volte ogni ora. Se un'app in background chiama di nuovo il metodo subito dopo, la classeWifiManager
fornisce i risultati memorizzati nella cache della scansione precedente.