Android Polling regular de GPS en servicio, maximizando la duración de la batería

Estoy tratando de escribir un servicio, que cada X minutos intenta obtener la ubicación GPS del dispositivo, y ejecutar y grabar en segundo plano, incluso cuando la aplicación no está en foco.

Por lo tanto, el tiempo para crear un servicio.

He creado un servicio, configurado el locationListener, tiene el gestor de ubicación y requestLocationUpdates … todo es bueno con el mundo .. esqueleto rudimentario de trabajo.

Ahora, no quiero que el GPS se ejecute constantemente ya que esto va a matar a la batería, lo que me gustaría que suceda es el servicio, encender el GPS, pedir una actualización, a continuación, cerrar (al menos su interés en la ubicación de GPS ) Y luego 5 o 10 minutos más tarde hacer esto de nuevo ..

Simplemente, en el método onLocationChanged () de mi listener, agrego la línea LocationManager (removeUpdates (locationListener)) .. así que cuando mi servicio pide una actualización, obtiene sólo una y se cierra.

Decido agregar un bucle poco tiempo, que efectivamente registra mi oyente de localización, y duerme durante X minutos. Así que lógicamente, debería registrar que quiere información, luego dormir .. una actualización viene, recibo esa actualización en el onLocationChange y se anula su intereste en el evento, apagar el GPS hasta la próxima ejecución del bucle.

Ahora, tengo dos preguntas 1) ¿Parece lógicamente bien? O hay una manera más elegante? Recuerde que quiero que este registro de información o no la aplicación de lanzamiento está en foco, y honestamente, incluso si la aplicación de lanzamiento fue asesinado le gustaría que el servicio para seguir funcionando potencialmente, pero que es una decisión de diseño que todavía no he hecho completamente.

La segunda pregunta es que necesitaré poner este LOOP dentro de un hilo desde que lo tenga en el oncreate, hace que el servicio acabe por morir porque su tomar demasiado tiempo para volver de oncreate, así que ¿cuál sería la mejor manera de ir ¿haciendo esto? AsyncTask es una opción, pero esta es una tarea que nunca es en teoría va a terminar .. Handler también parece una especie de tonto, ya que no hay devoluciones reales, su registro justo para las actualizaciones de GPS, y el código de desinterés está en el LocationListener OnLocationChange ().

No hay ninguna comunicación real que saldría de este hilo una vez instanciado, aunque tendría que ser señalado para morir / terminar cuando el servicio va a ser cerrado por alguna interacción del usuario para hacerlo …

Entonces, ¿debería simplemente usar un hilo base? Ir con un AsyncTask a pesar de su nunca realmente volver? O está utilizando el controlador la mejor opción? ¿O mi modelo acaba de terminar la mala forma fuera de la puerta?

One Solution collect form web for “Android Polling regular de GPS en servicio, maximizando la duración de la batería”

Creo que tener un servicio para administrar el GPS es la manera sensata de ir, especialmente si usted tiene más de una actividad que podría querer información de ubicación. Adopté este enfoque en mi aplicación.

Primero usé un Ibinder en el servicio y ligado a él desde las actividades con

 bindService (new Intent(....), mServconn, Context.BIND_AUTO_CREATE); 

En onStart ()

Y unbindService(mServconn); En onStop () de cada actividad

Tuve el uso de servicio sendBroadcast() a BroadcastReceivers registrado en las actividades. Los datos de ubicación se transmiten a través de extras en la intención de difusión.

Utilicé una máquina de estado en el servicio con 3 estados, IDLE, SEEKING y GOT_A_FIX_NOW_SLEEPING. El tiempo de reposo se transmite a través de un método 'changeGPSParameters' expuesto en un método público del servicio. Otro parámetro es la exactitud requerida, es decir, no difundir un mensaje hasta que haya tenido una solución mejor que la exactitud requerida, entonces usted puede dormir. Dormir significa apagar el GPS hasta que haya transcurrido el tiempo.

El tiempo es manejado por un Runnable y un Handler envía mensajes a él con el código como

 mHandler.postDelayed(this, mSleepTime ); 

Me parece que esto funciona bien. Cuando no hay actividades vinculadas al servicio, entonces onUnbind() se ejecutará en el servicio. En ese método usted apenas tiene que cerciorarse de que usted para el oyente de la localización y para el contador de tiempo con mHandler.removeCallbacks

ACTUALIZAR

A continuación se muestra un ejemplo sencillo de un Runnable que se puede iniciar / detener mediante dos botones en su main.xml que debe tener un único textview para mostrar el estado del temporizador:

 import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.widget.TextView; public class TimerLoopActivity extends Activity { private Handler mHandler = new Handler(); private int mSleepTime = 2; //seconds private int mLoopCount = 0; private Runnable mUpdateTimeTask = new Runnable() { public void run() { // Code here for when timer completes mLoopCount++; setTextBoxMsg("Running - count = " + mLoopCount); mHandler.removeCallbacks(this); mHandler.postDelayed(this, mSleepTime * 1000); // keep looping } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); setTextBoxMsg("Timer Idle"); } private void setTextBoxMsg(String string) { TextView tv = (TextView) findViewById(R.id.textView1); tv.setText(string); } public void myClickHandler(View target) { switch (target.getId()) { case R.id.startbutton: setTextBoxMsg("Starting timer"); startTimer(); break; case R.id.stopbutton: setTextBoxMsg("Stopping timer"); mLoopCount = 0; stopTimer(); break; } } private void stopTimer() { mHandler.removeCallbacks(mUpdateTimeTask); } private void startTimer() { mHandler.postDelayed(mUpdateTimeTask, mSleepTime * 1000);} } 

Usted puede adaptar esto para ponerlo en su servicio.

  • ¿Cómo iniciar AccessibilityService?
  • ¿Cómo saber cuántas aplicaciones se ejecutan en segundo plano en android?
  • No puedo encontrar la causa de mi accidente con este seguimiento de pila
  • Android: ¿Cómo repetir un servicio con AlarmManager cada 15 minutos, pero sólo se ejecuta de 8:00 AM a 18:00 PM?
  • Gran uso de memoria en las notificaciones
  • Inicio del servicio de fondo cuando se enciende Android
  • Vinculante para ejecutar el servicio (después de finish ()) / callback Handler
  • Servicio de Android que no recibe Actualizaciones de ubicación
  • Servicio de Android - URL de ping
  • ¿Por qué NullPointerException ocurre con el uso de BillingService estándar?
  • Notificación diaria de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.