Optimiza el uso de la ubicación para situaciones del mundo real

En esta sección, se describen algunos casos típicos de recopilación de ubicación, junto con recomendaciones para el uso óptimo del geovallado y las API de proveedores de ubicación combinada.

Actualizaciones visibles para el usuario o en primer plano

Ejemplo: una app de mapas que necesita actualizaciones frecuentes y precisas con una latencia muy baja. Todas las actualizaciones se realizan en primer plano: el usuario inicia una actividad, consume datos de ubicación y, luego, detiene la actividad al poco tiempo.

Usa el método setPriority() con un valor de PRIORITY_HIGH_ACCURACY o PRIORITY_BALANCED_POWER_ACCURACY.

El intervalo especificado en el método setIntervalMillis() depende del caso de uso: para situaciones en tiempo real, establece el valor en unos segundos; de lo contrario, limítalo a unos minutos (se recomienda aproximadamente dos minutos o más para minimizar el uso de la batería).

Cómo detectar la ubicación del dispositivo

Ejemplo: Una app del clima quiere saber la ubicación del dispositivo.

Usa el método getLastLocation(), que devuelve la ubicación disponible más reciente (que, en casos excepcionales, puede ser nula). Este método proporciona una forma sencilla de obtener la ubicación y no genera costos asociados con la solicitud activa de actualizaciones de ubicación. Úsala junto con el método isLocationAvailable(), que devuelve true cuando la ubicación que muestra getLastLocation() está razonablemente actualizada.

Cómo iniciar actualizaciones cuando un usuario se encuentra en una ubicación específica

Ejemplo: Solicitar actualizaciones cuando un usuario se encuentra a una distancia determinada del trabajo, la casa o cualquier otra ubicación.

Usa el geovallado junto con las actualizaciones del proveedor de ubicación combinada. Solicita actualizaciones cuando la app reciba un activador de entrada de geovalla y quita las actualizaciones cuando la app reciba un activador de salida de geovalla. Esto garantiza que la app obtenga actualizaciones de ubicación más detalladas solo cuando el usuario haya ingresado a un área definida.

El flujo de trabajo típico para esta situación podría implicar la aparición de una notificación en el momento en que el geovallado entra en transición y el lanzamiento de una actividad que contiene código para solicitar actualizaciones cuando el usuario presiona la notificación.

Cómo iniciar actualizaciones basadas en el estado de la actividad del usuario

Ejemplo: Solicitar actualizaciones solo cuando el usuario conduce o anda en bicicleta.

Usa la API de reconocimiento de actividad junto con las actualizaciones del proveedor de ubicación combinada. Solicita actualizaciones cuando se detecte la actividad objetivo y quítalas cuando el usuario deje de realizar esa actividad.

El flujo de trabajo típico para este caso de uso podría implicar mostrar una notificación para la actividad detectada y, luego, iniciar una actividad que contenga código para solicitar actualizaciones cuando el usuario presione la notificación.

Actualizaciones de ubicación a largo plazo en segundo plano vinculadas a áreas geográficas

Ejemplo: El usuario quiere recibir una notificación cuando el dispositivo esté cerca de una tienda.

Este es un excelente caso de uso para el geovallado. Como es casi seguro que el caso de uso implique la ubicación en segundo plano, usa el método addGeofences(GeofencingRequest, PendingIntent).

Debes establecer las siguientes opciones de configuración:

  • Si realizas un seguimiento de las transiciones de permanencia, usa el método setLoiteringDelay() y pasa un valor de aproximadamente cinco minutos o menos.

  • Usa setNotificationResponsiveness() y pasa un valor de aproximadamente cinco minutos. Sin embargo, considera usar un valor de aproximadamente diez minutos si tu app puede administrar la demora adicional en la capacidad de respuesta.

Una app solo puede registrar un máximo de 100 geovallados a la vez. En un caso de uso en el que una app quiera hacer un seguimiento de una gran cantidad de opciones de minoristas, es posible que la app deba registrar una geovalla grande (a nivel de la ciudad) y registrar de forma dinámica geovallas más pequeñas (para ubicaciones dentro de la ciudad) para las tiendas dentro de la geovalla más grande. Cuando un usuario ingrese a una geovalla grande, agrega geovallas más pequeñas. Cuando el usuario salga de la geovalla más grande, quita las geovallas más pequeñas y vuelve a registrar geovallas para un área nueva.

Actualizaciones de ubicación a largo plazo en segundo plano sin un componente de app visible

Ejemplo: una app que rastrea la ubicación de forma pasiva

Si es posible, usa el método setPriority() con la opción PRIORITY_PASSIVE, ya que casi no consume batería. Si no es posible usar PRIORITY_PASSIVE, usa PRIORITY_BALANCED_POWER_ACCURACY o PRIORITY_LOW_POWER, pero evita usar PRIORITY_HIGH_ACCURACY para el trabajo en segundo plano sostenido, ya que esta opción agota la batería de forma considerable.

Si necesitas más datos de ubicación, usa la ubicación pasiva llamando al método setMinUpdateIntervalMillis() y pasando un valor menor que el que pasas a setIntervalMillis(). Cuando se combina con la opción PRIORITY_PASSIVE, la ubicación pasiva puede entregar de manera oportuna la ubicación calculada por otras apps sin costo adicional.

Modera la frecuencia agregando un poco de latencia con el método setMaxUpdateDelayMillis(). Por ejemplo, si usas el método setIntervalMillis() con un valor de aproximadamente 10 minutos, deberías llamar a setMaxUpdateDelayMillis() con un valor de entre 30 y 60 minutos. Con estas opciones, la ubicación se calcula para tu app aproximadamente cada 10 minutos, pero la app solo se activa cada 30 a 60 minutos con algunos datos de ubicación disponibles como una actualización por lotes. Este enfoque intercambia la latencia por más datos disponibles y un mejor rendimiento de la batería.

Actualizaciones frecuentes de precisión alta mientras el usuario interactúa con otras apps

Ejemplo: Una app de navegación o fitness que sigue funcionando cuando el usuario apaga la pantalla o abre otra app.

Utiliza un servicio en primer plano. Si tu app podría realizar un trabajo costoso en nombre del usuario, se recomienda que se lo informes. Un servicio en primer plano requiere una notificación persistente. Para obtener más información, consulta Descripción general de las notificaciones.