Realiza las siguientes acciones para mejorar el impacto de tu app en la duración de batería de un dispositivo cuando uses los servicios de ubicación.
Quita actualizaciones de ubicación
Una fuente común de agotamiento innecesario de la batería es la falta de eliminación de las actualizaciones de ubicación cuando ya no son necesarias.
Esto puede ocurrir cuando los métodos de ciclo de vida onStart()
o onResume()
de una actividad contienen una llamada a requestlocationUpdates()
sin una llamada correspondiente a removeLocationUpdates()
en los métodos de ciclo de vida onPause()
o onStop()
.
Puedes utilizar componentes que prioricen los ciclos de vida para administrar mejor el ciclo de vida de las actividades de tu app. Para obtener más información, consulta Cómo controlar ciclos de vida con componentes que los priorizan.
Establece tiempos de espera
Para evitar el agotamiento de la batería, establece un tiempo de espera razonable cuando deban detenerse las actualizaciones de ubicación. El tiempo de espera garantiza que las actualizaciones no continúen indefinidamente y protege a la app en situaciones donde se solicitan actualizaciones, pero no se las quita (por ejemplo, debido a un error en el código).
Para una solicitud de proveedor de ubicación combinada, agrega un tiempo de espera llamando a setExpirationDuration()
, que recibe un parámetro que representa el tiempo en milisegundos desde la última vez que se llamó al método. También puedes agregar un tiempo de espera llamando a setExpirationTime()
, que recibe un parámetro que representa el tiempo de vencimiento en milisegundos desde el último inicio del sistema.
Para agregar un tiempo de espera a una solicitud de ubicación de geovallado, llama al método setExpirationDuration()
.
Utiliza solicitudes por lotes
Para todos los casos prácticos que no sean en primer plano, agrupa varias solicitudes al mismo tiempo. Usa el método setInterval()
para especificar el intervalo en el que quieres que se calcule la ubicación. Luego, usa el método setMaxWaitTime()
para establecer el intervalo en el que se entrega la ubicación a tu app. Pasa un valor al método setMaxWaitTime()
que sea múltiplo del valor que se pasa al método setInterval()
. Por ejemplo, considera la siguiente solicitud de ubicación:
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);
En este caso, el sistema calcula la ubicación aproximadamente cada diez minutos y entrega alrededor de seis puntos de datos de ubicación en un lote por hora. Si bien todavía recibes actualizaciones de ubicación cada diez minutos aproximadamente, consumes menos batería porque el dispositivo se activa solamente una vez por hora.
Usa actualizaciones de ubicación pasiva
En casos prácticos en segundo plano, es una buena idea limitar las actualizaciones de ubicación. Los límites de Android 8.0 (nivel de API 26) imponen esta práctica, pero las apps que se ejecutan en dispositivos más antiguos deben esforzarse por limitar la ubicación en segundo plano tanto como sea posible.
Es probable que mientras tu app esté en segundo plano, otra app solicite con frecuencia actualizaciones de ubicación en primer plano. Los servicios de ubicación ponen estas actualizaciones a disposición de tu app. Considera usar la siguiente solicitud, que consume datos de ubicación de forma oportuna:
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);
En el ejemplo anterior, la ubicación de la app se calcula aproximadamente cada 15 minutos. Si otras apps solicitan la ubicación, la app recibe los datos en un intervalo máximo de dos minutos.
Si bien consumir datos de la ubicación de forma pasiva no genera un agotamiento de la batería, ten especial cuidado en los casos en que recibir datos de ubicación desencadene operaciones demandantes de CPU o de E/S. Para minimizar los costos de la batería, el intervalo especificado en setFastestInterval()
no debería ser demasiado pequeño.