2015-03-14 26 views
7

Sto creando un'app che controlla le posizioni degli utenti ogni mezz'ora e aggiorna la posizione dell'utente nel database locale e quindi esegue query CRUD in base alla posizione dell'utente anche quando l'app non è in esecuzione. Come lo faccio ?Processo in background per eseguire la scansione del percorso dell'utente a intervalli regolari e aggiornare il database locale anche quando l'app non è aperta

Mi sono riferito a questo articolo http://techtej.blogspot.com.es/2011/03/android-thread-constructspart-4.html e sono ancora confuso su quale sia l'approccio corretto per il mio risultato?

Ci sono 4 opzioni, secondo l'articolo per quello che ho intenzione di realizzare secondo me

1) Servizio: Ma dal momento che mi sento che sarebbe stata una lunga operazione con il database locale, sento di dover ignorare questo uno.

2) IntentService: Questo non può eseguire più operazioni, così mi sento anche questo dovrebbe essere evitato per me come devo ottenere la posizione dell'utente e la scansione del database, aggiornare il database (3 compiti)

3) Discussione: non sono sicuro di come chiamare quando l'app non è aperta

4) AsyncTask: non sono sicuro di come chiamare quando l'app non è aperta.

Fondamentalmente sto cercando qualcosa come un LAVORO CRON che viene eseguito su un database locale mentre si lavora sui dati di posizione.

Sarebbe bello se potessi collegarmi ad alcuni tutorial e rispondere con un semplice esempio per farmi capire la differenza di tutti e 4 i metodi.

// Editted il 16 marzo: Ho letto qualcosa su un JobScheduler che viene introdotto nella API 21, ma non è sicuro se supporta anche fino a Gingerbread ed è l'approccio giusto per la mia domanda

Thanx

risposta

1

Penso che stiate cercando qualcosa di simile a WakefulIntentService. Questo gestisce tutti i casi completamente.

È possibile eseguire la posizione e il lavoro relativo a db all'interno di doWakefulWork() di detta implementazione.

3

Avete considerato l'utilizzo di un SyncAdapter. È meglio programmare i lavori a intervalli fissi e ottimizzati anche per l'utilizzo della batteria. Inoltre, una volta avviato, può essere eseguito indipendentemente dall'app. Secondo le vostre esigenze, credo che questo sia più adatto alle vostre esigenze. Puoi leggere su questo here.Ciò rimuove anche il caso d'angolo di avvio del servizio (generalmente utilizzato) al riavvio del dispositivo. L'app continuerà a eseguire il lavoro pianificato anche se il dispositivo viene riavviato.

Nel SyncAdapter è necessario utilizzare ContentProvider per includere il DB in un ContentProvider. Inoltre, preferibilmente utilizzare un CursorLoader per eseguire attività longrunning su DB. Si dovrebbe leggere su CursorLoader. Questo è un ottimo modo per accedere alle tue risorse. Inoltre, è possibile definire un modello di progettazione dell'osservatore che osserva le modifiche in un DB e eseguirà un'attività quando le modifiche vengono apportate in DB. Questo può essere utilizzato anche all'interno dell'applicazione stessa e anche all'interno di SyncAdapter. Il caricatore del cursore è preferibile per il lavoro in background su DB. È possibile eseguire tutte le operazioni CRUD utilizzando CursorLoader e ContentProvider.

3

Questo non può eseguire più attività

Sì, è possibile. Ha solo un thread e quindi può eseguire solo un'attività simultanea.

devo ottenere la posizione dell'utente e la scansione del database, aggiornare il database (3 compiti)

Non ho idea del motivo per cui si pensa che è tre compiti. Non puoi farli simultaneamente.

Il tuo problema più grande con IntentService è che ottenere dati sulla posizione è asincrono e IntentService non è adatto per chiamare le API che sono asincrone.

Ma poiché ritengo che sarebbe una lunga operazione con il database locale, sento che dovrei ignorarlo.

Il punto dietro qualsiasi servizio è per "una lunga operazione".

Fondamentalmente io alla ricerca di qualcosa di simile a un job cron che viene eseguito su un database locale mentre si lavora sui dati di localizzazione

Usa AlarmManager di innescare un WakefulBroadcastReceiver, che poi innesca un Service. Lo Service, in onStartCommand(), esegue il fork di un thread in background per (in modo asincrono) il percorso e l'aggiornamento del database. Il Service può quindi chiamare completeWakefulIntent() su WakefulBroadcastReceiver, più stopSelf() con il startId ricevuto in onStartCommand() per questo lavoro, oltre a consentire la terminazione del thread. Se nessun altro comando è stato ricevuto nel frattempo, il servizio si spegnerà.

+0

la prego di aiutarmi con questo http://stackoverflow.com/questions/30300157/push-notifications-not-received-by-everyone –

+0

potrebbe u mi aiutare con questo http://stackoverflow.com/domande/30947115/how-to-implementare-un-azione-bar-like-google-maps –

4

Quando si registra la posizione degli utenti, utilizzare un servizio con una notifica. Solo per creare un'app moralmente responsabile che informa l'utente che l'app li sta monitorando. Il servizio per definizione viene eseguito in background.

Un fornitore di posizione fuso con setinterval(long)30 minutes ottiene l'intervallo. Impostare fastestInterval() su un minuto per ricevere i dati GPS quando altre app utilizzano il GPS.

1

Ho fatto quello che stai cercando, sia con GPS e non GPS.

Il progetto ho preso come punto fisso per la soluzione non-GPS fa già tutto ciò che serve, ed è batteria-friendly (crediti dovrebbero andare a Kenton Prezzo):

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

Date un'occhiata a Funziona come un fascino. Basta eseguirlo su qualsiasi dispositivo. Se hai bisogno di aiuto per personalizzare, fammelo sapere.

Basta modificare il metodo "onReceive" nel "TestBroadcastReceiver" per aggiornare il DB.

Se avete bisogno della soluzione GPS fatemelo sapere, ma l'ho lasciato cadere per essere un killer della batteria!

Spero che aiuti.