ubicacion señal saber reiniciar pokemon mejorar google funciona detecta como calibrar android service background gps

señal - reiniciar gps android



Android Regular GPS Polling en servicio, maximizando la duración de la batería (1)

Estoy intentando escribir un servicio, que cada X minutos intentará obtener la ubicación GPS del dispositivo, y ejecutarlo y grabarlo en segundo plano, incluso cuando la aplicación no esté en buen estado.

Entonces, es hora de crear un servicio.

Creé un servicio, configuré el LocationListener, obtuve el Location Manager y requestLocationUpdates ... todo está bien con el mundo ... el esqueleto rudimentario funciona.

Ahora, no quiero que el GPS funcione constantemente ya que esto matará a la batería, lo que me gustaría que ocurra es el servicio, encender el GPS, solicitar una actualización, luego cerrar (al menos, su interés en la ubicación GPS) ) y luego 5 o 10 minutos más tarde haz esto de nuevo ...

Bastante simple, en el método onLocationChanged () de mi oyente, agrego la línea LocationManager (removeUpdates (locationListener)) ... así que cuando mi servicio solicita una actualización, solo obtiene una, y se apaga.

Decido agregar un pequeño bucle, que efectivamente registra mi escucha de ubicación y duerme durante X minutos. Entonces lógicamente, debe registrar que quiere información, luego dormir ... llega una actualización, obtengo esa actualización en el cambio de ubicación y desregistra su interés en el evento, apagando el GPS hasta la próxima ejecución del ciclo.

Ahora, tengo 2 preguntas 1) ¿Parece esto lógicamente bien? o hay una manera más elegante? Recuerda que quiero que esto registre la información de si la aplicación de lanzamiento está enfocada o no, y sinceramente, incluso si la aplicación de lanzamiento fue eliminada, me gustaría que el servicio continúe ejecutándose potencialmente, pero esa es una decisión de diseño que todavía no he tomado en su totalidad.

La segunda pregunta es, tendré que poner este LOOP dentro de un hilo ya que tenerlo en el oncreate, ocasiona que el servicio sea eventualmente asesinado porque tarda demasiado en volver de oncreate, entonces ¿cuál sería la mejor manera de hacerlo? ¿haciendo esto? AsyncTask es una opción, pero esta es una tarea que, en teoría, nunca terminará ... Handler también parece algo tonto, ya que no hay devoluciones de llamada reales, solo se está registrando para las actualizaciones de GPS, y el código de desinterés está en el LocationListener onLocationChange ()

No existe una comunicación real que surja de este hilo una vez instanciada, aunque necesitaría ser señalada para que muera / termine cuando el servicio sea cerrado por alguna interacción del usuario para hacerlo ...

Entonces, ¿debería simplemente usar un hilo base? Ir con una AsyncTask a pesar de que nunca regresará? o está utilizando el controlador la mejor opción? ¿O mi modelo acaba de completar una mala forma desde la puerta?


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

Primero utilicé un Ibinder en el servicio y me limité a las actividades con

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

en onStart ()

y unbindService(mServconn); en onStop () de cada actividad

Hice que el servicio utilizara sendBroadcast() para BroadcastReceivers registrados en las actividades. Los datos de ubicación se pasan a través de extras en el intento de transmisión.

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

El tiempo es administrado por un Runnable y un Handler le envía mensajes con un código como

mHandler.postDelayed(this, mSleepTime );

Encuentro que esto funciona bien Cuando no hay actividades vinculadas al servicio, onUnbind() se ejecutará en el servicio. En ese método, solo tiene que asegurarse de detener el oyente de ubicación y detener el temporizador con mHandler.removeCallbacks

ACTUALIZAR

A continuación se muestra un ejemplo simple de Runnable que puede iniciar / detener mediante dos botones en su main.xml que debe tener una única vista de texto 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);} }

Puede adaptar esto para ponerlo a su servicio.