2013-07-03 7 views
6

Ho un'app che non richiede quasi nessuna interazione da parte dell'utente, ma richiede Geofences. Posso eseguire tutto questo all'interno di un servizio in background?Posso eseguire Android GeoFencing interamente all'interno di un servizio in background?

Ci sarà un'attività al primo avvio del servizio. Questa attività avvierà un servizio e registrerà un BroadcastReceiver per BOOT_COMPLETED, quindi il servizio inizierà all'avvio. È improbabile che questa attività venga mai eseguita di nuovo.

Il servizio imposterà periodicamente un allarme che provocherà a un IntentService di scaricare un elenco di posizioni dalla rete. In questo IntentService verrà quindi impostato Geofences in tali posizioni e verrà creato PendingIntents che verrà attivato quando verranno raggiunte le posizioni. A loro volta, quei PendingIntents causeranno un altro IntentService a prendere qualche azione.

Tutto ciò deve avvenire in background, senza alcuna interazione da parte dell'utente a parte l'avvio dell'attività per la prima volta dopo l'installazione. Pertanto, l'attività non interagirà con LocationClient o con qualsiasi servizio di localizzazione.

In realtà ho questo set up con proximityAlerts, ma desidero passare alla nuova API Geofencing per motivi di durata della batteria. Tuttavia, ho sentito che ci possono essere alcuni problemi con l'utilizzo di LocationClient all'interno di un servizio. In particolare, quello che ho sentito (mi dispiace, senza riferimenti, solo per sentito dire sinistri):

  • posizione client si basa sulla disponibilità ui per la gestione
  • quando viene chiamato dal thread in background errore, LocationClient.connect() presuppone che viene chiamato dal thread ui principale (o altro thread con looper evento), quindi la callback della connessione non viene mai chiamata, se chiamiamo questo metodo dal servizio in esecuzione in thread di sfondo

Quando ho indagato, non riesco a vedere qualsiasi motivo per cui questo sarebbe il caso, o perché avrebbe smesso di fare quello che volevo. Speravo che sarebbe stato quasi un rimpiazzo sostitutivo per proximityAlerts ...

Qualcuno può far luce sulle cose qui?

risposta

2

La cosa migliore sarebbe provarlo, giusto? La tua strategia sembra solida.

when called from background thread, LocationClient.connect() assumes that it is called from main ui thread (or other thread with event looper), so connection callback is never called, if we call this method from service running in background thread. 

So che questo non è vero. Dispongo di un servizio avviato da un'attività e viene richiamata la richiamata della connessione.

Non so gli avvisi di prossimità; ma non riesco a trovare una API per elencare i miei GeoFences. Sono preoccupato che il mio database (sqlite) e le recinzioni attuali potrebbero non essere sincronizzati. Questo è un difetto di design secondo me.

Il motivo per cui LocationClient ha bisogno dell'interfaccia utente, è che il dispositivo potrebbe non avere installato Google Play Services. Google ha messo a punto un meccanismo astuto e complesso che consente alla tua app di richiedere all'utente di scaricarlo. Il tutto è orribile e terribile secondo me. È tutta una programmazione "what-if what-if".

(Si sono precipitati un sacco di roba fuori dalla porta per google IO 2013. Non tutti sono ben documentati, e alcuni di essi sembrano un po '"approssimativi").

+0

Non sono riuscito a trovare e API per elencare Geofences, e mi piacerebbe avere uno pure. Sono anche preoccupato che il mio sqlite db e l'attuale lista di recinti registrati non siano sincronizzati ... –

Problemi correlati