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 una tarea de fondo de larga ejecución en el servicio de Android
  • Android detecta el estado táctil desde cualquier aplicación
  • Servicio de Android y tareas repetitivas que se ejecutan en subprocesos
  • El servicio de fondo de Android se está reiniciando cuando se cancela la aplicación
  • El servicio no se reinicia después de que "Clear Memory" + appWidget se bloquea
  • Reconocimiento de voz como servicio de fondo
  • ¿Hay una alternativa onBackPressed () para un servicio?
  • GCM de Android SERVICE_NOT_AVAILABLE
  • Cómo saber si el usuario está en la pantalla de bloqueo desde el servicio
  • El punto de interrupción en servicio no funciona
  • Cómo ensayar un servicio de Android que depende de una conexión de red
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.