Llamada de escucha de la ubicación de Android muy a menudo

Estoy utilizando el proveedor de ubicación de red. Necesito llamar al método onLocationChanged desde mi LocationListener sólo una vez por 1 hora. Aquí está mi código:

MyLocationListener locationListener = new MyLocationListener(); locationMangaer.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 3600000, 0,locationListener); 

Pero no funciona. Mi onLocationChanged llamando muy a menudo.

¿Qué parámetros debo utilizar?

De la documentación LocationManager#requestLocationUpdates() :

Antes de Jellybean, el parámetro minTime era sólo una pista, y algunas implementaciones de proveedores de ubicación lo ignoraban. Desde Jellybean y en adelante es obligatorio para los dispositivos compatibles con Android observar tanto los parámetros minTime como minDistance.

Sin embargo, puede utilizar requestSingleUpdate() con un Looper y Handler para ejecutar las actualizaciones una vez por hora.


Adición
Para empezar, puede leer más sobre Loopers y Handlers aquí .

Está utilizando API 8 que es una buena opción, pero esto limita los métodos de LocationManager que podemos llamar ya que la mayoría se introdujeron en la API 9. La API 8 sólo tiene estos tres métodos:

 requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener) requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener, Looper looper) requestLocationUpdates(String provider, long minTime, float minDistance, PendingIntent intent) 

Vamos a usar el primer método, es el más simple.

Primero, cree su LocationManager y LocationListener como lo haría normalmente, pero en onLocationChanged() deje de solicitar más actualizaciones:

 @Override public void onLocationChanged(Location location) { mLocationManager.removeUpdates(mLocationListener); // Use this one location however you please } 

En segundo lugar, crear un par de nuevas variables de clase:

 private Handler mHandler = new Handler(); private Runnable onRequestLocation = new Runnable() { @Override public void run() { // Ask for a location mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener); // Run this again in an hour mHandler.postDelayed(onRequestLocation, DateUtils.HOUR_IN_MILLIS); } }; 

Por supuesto, deberías desactivar todas tus devoluciones de llamada en onPause() y habilitarlas de nuevo en onResume() para evitar que el LocationManager onResume() recursos al adquirir actualizaciones no utilizadas en segundo plano.


Un punto más técnico:
Si está preocupado por bloquear el subproceso de interfaz de usuario con LocationManager, puede utilizar el segundo método requestLocationUpdates() para proporcionar un Looper específico a partir de un nuevo Thread (por ejemplo, un HandlerThread).

  • ¿Cómo evitar fallos debido a entradas de cadena faltantes?
  • ¿Cómo puedo utilizar msgid durante la localización de las cadenas de Android?
  • Android localiza es-r419
  • Establecer configuración regional que no funciona en tablets
  • Comportamiento inesperado de telephonyManager.getSimCountryIso ()
  • Forzar locale para Android con resConfig
  • Android.content.res.Resources $ NotFoundException: ID de recurso de cadena
  • Android: Diferencia entre LocationManager.addProximityAlert () & LocationClient.addGeofences ()
  • Código para soporte multilingüe en android
  • ¿Cómo puedo poner un parámetro en una cadena localizada en Android?
  • OnLocationChanged la devolución de llamada se hace en qué hilo? El hilo principal de la interfaz de usuario?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.