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?
- Service vs Thread en Android
- El servicio onCreate de Android se llama varias veces sin llamar a onDestroy
- Cómo programar una ejecución de código en android o: ¿qué son exactamente los hilos de daemon en android?
- Android Service nunca parece iniciar - onStartCommand () no se llama
- El servicio de Android se detiene cuando se cierra la aplicación
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
- ((Botón)) dentro de un servicio no funciona
- Cómo obtener la instancia de Servicio local de Android
- Android: habilitar y servicios
- Android: comprueba si mi servicio se está ejecutando en segundo plano
- PARTIAL_WAKE_LOCK vs SCREEN_DIM_WAKE_LOCK en el subproceso de descarga
- Android-Servicio matado con "ya no quieren" - cómo reiniciarlo?
- Observable vs. Servicio en Android
- Las preferencias compartidas a veces se eliminan
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á