Antecedentes Proceso para escanear la ubicación del usuario a intervalos regulares y actualizar la base de datos local incluso cuando la aplicación no está abierta

Estoy creando una aplicación que comprueba las ubicaciones de los usuarios cada media hora y actualiza la ubicación del usuario en la base de datos local y luego ejecuta consultas CRUD basadas en la ubicación del usuario incluso cuando la aplicación no se está ejecutando. Cómo lo hago ?

Me he referido a este artículo http://techtej.blogspot.com.es/2011/03/android-thread-constructspart-4.html y todavía estoy confundido acerca de cuál es el enfoque correcto para mi resultado?

Hay 4 opciones según el artículo para lo que intento alcanzar según mí

1) Servicio: Pero ya que siento que sería una operación larga con la base de datos local, siento que debo ignorar este.

2) IntentService: Esto no puede realizar varias tareas, así que siento que esto también debe ser evitado para mí, ya que tengo que obtener la ubicación del usuario y escanear la base de datos, actualizar la base de datos (3 tareas)

3) Tema: No estoy seguro de cómo llamar a esto cuando la aplicación no está abierta

4) AsyncTask: No estoy seguro de cómo llamar a esto cuando la aplicación no está abierta.

Básicamente estoy buscando algo así como un CRON JOB que se ejecuta en una base de datos local mientras se trabaja en los datos de ubicación.

Sería genial si pudiera vincularme a algunos tutoriales y responder con un ejemplo simple para hacerme entender la diferencia de todos los 4 métodos.

// editado el 16 de marzo: He leído algo acerca de un JobScheduler que se introduce en la API 21, pero no estoy seguro si también soporta hasta Gingerbread y es el enfoque correcto para mi pregunta

Gracias

Al registrar la posición de los usuarios utilice un servicio con una notificación. Sólo por el bien de la creación de una aplicación moralmente responsable que informa al usuario de la aplicación es el seguimiento de ellos. Por definición, el servicio se ejecuta en segundo plano.

Un proveedor de ubicación fusionado con setinterval(long) 30 minutes obtiene el intervalo. Establezca fastestInterval() en un minuto para recibir datos GPS cuando otras aplicaciones estén utilizando el GPS.

¿Ha considerado utilizar un SyncAdapter? Lo mejor es programar trabajos a intervalos fijos y también optimizar el uso de la batería. Además, una vez iniciado, puede ejecutarse independientemente de la aplicación. Según sus requisitos, creo que esto es más adecuado para su necesidad. Puedes leer sobre esto aquí . Esto también elimina el caso de inicio del servicio (generalmente utilizado) cuando se reinicia el dispositivo. Su aplicación seguirá ejecutando el trabajo programado incluso si el dispositivo se reinicia.

En el SyncAdapter usted tiene que utilizar un ContentProvider así que envuelva su DB dentro de un ContentProvider. También, preferiblemente utilice un CursorLoader para ejecutar tareas de larga duración en DB. Debería leer acerca de CursorLoader . Esta es una excelente forma de acceder a sus recursos. Además, puede definir un patrón de diseño de Observador que observa los cambios en un DB y realizará una tarea cuando se realicen cambios en el DB. Esto también se puede utilizar dentro de su aplicación en sí y también dentro de SyncAdapter. Cursor Loader es mejor preferido para el trabajo de fondo en DB. Puede realizar todas las operaciones CRUD utilizando un CursorLoader y ContentProvider.

Esto no puede realizar varias tareas

Sí puede. Tiene sólo un hilo, por lo que sólo puede realizar una tarea simultánea .

Tengo que obtener la ubicación del usuario y escanear la base de datos, actualizar la base de datos (3 tareas)

No tengo ni idea de por qué crees que son tres tareas. No puedes hacerlo simultáneamente.

Su mayor problema con IntentService es que obtener datos de ubicación es asíncrono, y IntentService no es muy adecuado para las API de llamada que son asíncronas.

Pero ya que siento que sería una operación larga con la base de datos local, siento que debo ignorar esta.

El punto detrás de cualquier servicio es para "una operación larga".

Básicamente estoy buscando algo así como un CRON JOB que se ejecuta en una base de datos local mientras se trabaja en los datos de ubicación

Utilice AlarmManager para activar un WakefulBroadcastReceiver , que luego activa un Service . El Service , en onStartCommand() , bifurca un subproceso de fondo para (asincrónicamente) recuperar la ubicación y actualizar la base de datos. El Service puede llamar a completeWakefulIntent() en WakefulBroadcastReceiver , además de stopSelf() con el startId recibido en onStartCommand() para este trabajo, además de permitir que el hilo termine. Si no se recibieron otros comandos entretanto, el servicio se cerrará.

Creo que usted está buscando algo similar a WakefulIntentService . Esto maneja todos sus casos completamente.

Puede hacer su ubicación y trabajo relacionado con DB dentro de doWakefulWork () de dicha implementación.

He hecho lo que estás buscando, tanto con GPS como sin GPS.

El proyecto que tomé como punto de mira para la solución no GPS ya hace todo lo que necesita, y es compatible con las pilas (los créditos deben ir a Kenton Price):

https://code.google.com/p/little-fluffy-location-library/

Echa un vistazo, funciona como un encanto. Simplemente ejecútelo en cualquier dispositivo. Si usted necesita cualquier ayuda que modifica para requisitos particulares apenas déjeme saben.

Simplemente edite el método "onReceive" en el "TestBroadcastReceiver" para actualizar su base de datos.

¡Si usted necesita la solución del GPS déjeme saben también, pero la dejé caer para ser un asesino de la batería!

Espero eso ayude.

1. Creo que para este requisito, Thread y dentro de él AsyncTask – esta estructura será útil.

En el enlace proporcionado por usted, se menciona muy bien aquí

2. Para la localización blog relacionado, usted puede comprobar materiales útiles aquí:

(1) Diferencia entre las API de distancia e indicaciones de Google Map

(2) Marque esta respuesta también

Espero que esto te ayudará

  • Android API21: VoiceInteractionService onReady () no se llama
  • Android: ¿Es mejor iniciar y detener un servicio cada vez que sea necesario o dejar que un servicio funcione y se vincule y se desvincule de él?
  • El servicio no se detendrá cuando el método stopService se llame
  • Cómo mantener un servicio de Intent funcionando
  • La vinculación al servicio que ya fue iniciada por BroadcastReceiver crea una nueva instancia de servicio
  • Android: no se puede iniciar la intención de servicio: ¿no se encuentra?
  • Android cómo mantener la biblioteca nativa cuando la aplicación se detuvo
  • Recibe mensajes MMS en Android KitKat
  • Mi BroadcastReceiver no está recibiendo la intención BOOT_COMPLETED después de mis botas N1
  • Servicio de fondo en Android - Necesita ayuda
  • Activar el servicio de fondo en un momento específico de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.