Optimiser l'utilisation des services de localisation pour une meilleure autonomie

Suivez les étapes ci-dessous pour améliorer l'impact de votre application sur l'autonomie de la batterie d'un appareil lorsque vous utilisez les services de localisation.

Supprimer les mises à jour de la position

Une cause fréquente de décharge inutile de la batterie est l'impossibilité de supprimer les mises à jour de la position géographique lorsqu'elles ne sont plus nécessaires.

Cela peut se produire lorsque les méthodes de cycle de vie onStart() ou onResume() d'une activité contiennent un appel de requestlocationUpdates() sans appel correspondant de removeLocationUpdates() dans les méthodes de cycle de vie onPause() ou onStop().

Vous pouvez utiliser des composants compatibles avec le cycle de vie pour mieux gérer le cycle de vie des activités dans votre application. Pour en savoir plus, consultez la page Gérer les cycles de vie avec des composants compatibles avec le cycle de vie.

Définir des délais avant expiration

Pour éviter la décharge de la batterie, définissez un délai raisonnable pour l'arrêt des mises à jour de la position. Le délai d'expiration garantit que les mises à jour ne se poursuivent pas indéfiniment et protège l'application dans les cas où des mises à jour sont demandées, mais pas supprimées (par exemple, en raison d'un bug dans le code).

Pour une requête Fused Location Provider, ajoutez un délai avant expiration en appelant setExpirationDuration(), qui reçoit un paramètre qui représente le temps écoulé, en millisecondes, depuis le dernier appel de la méthode. Vous pouvez également ajouter un délai avant expiration en appelant setExpirationTime(), qui reçoit un paramètre qui représente le délai d'expiration en millisecondes depuis le dernier démarrage du système.

Pour ajouter un délai avant expiration à une requête de zone de géorepérage, appelez la méthode setExpirationDuration().

Requêtes par lot

Pour tous les cas d'utilisation hors premier plan, regroupez les requêtes par lot. Utilisez la méthode setInterval() pour spécifier l'intervalle auquel vous souhaitez calculer la position. Ensuite, utilisez la méthode setMaxWaitTime() pour définir l'intervalle auquel l'emplacement est diffusé à votre application. Transmettez une valeur à la méthode setMaxWaitTime() qui est un multiple de la valeur transmise à la méthode setInterval(). Prenons l'exemple de la requête de position suivante:

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);

Dans ce cas, le système calcule la position environ toutes les 10 minutes et envoie environ six points de données de localisation par lot environ toutes les heures. Bien que vous receviez toujours les mises à jour de position toutes les 10 minutes environ, vous préservez la batterie, car votre appareil n'est activé que toutes les heures environ.

Utiliser des mises à jour de position passives

Dans les cas d'utilisation en arrière-plan, il est recommandé de limiter les mises à jour de la position. Les limites d'Android 8.0 (niveau d'API 26) appliquent cette pratique, mais les applications exécutées sur des appareils plus anciens doivent limiter autant que possible la localisation en arrière-plan.

Il est probable que pendant que votre application est exécutée en arrière-plan, une autre application demande fréquemment des mises à jour de position au premier plan. Les services de localisation mettent ces mises à jour à disposition de votre application. Prenons la requête de localisation suivante, qui utilise les données de localisation avec opportunisme :

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);

Dans l'exemple précédent, la position de l'application est calculée toutes les 15 minutes environ. Si d'autres applications demandent la localisation, l'application reçoit les données dans un intervalle maximum de deux minutes.

Bien que l'utilisation passive de l'emplacement n'entraîne pas de décharge de la batterie, soyez particulièrement vigilant lorsque la réception de données de localisation déclenche des opérations coûteuses d'E/S ou de processeur. Pour minimiser l'impact sur la batterie, l'intervalle spécifié dans setFastestInterval() ne doit pas être trop petit.