2013-07-03 14 views
6

Mam aplikację, która prawie nie wymaga interakcji użytkownika, ale wymaga Geofence. Czy mogę uruchomić to całkowicie w ramach usług w tle?Czy mogę całkowicie uruchomić system Android GeoFencing w ramach usług w tle?

Po pierwszym uruchomieniu usługa wykona czynność. To działanie uruchomi usługę i zarejestruje BroadcastReceiver dla BOOT_COMPLETED, więc usługa rozpocznie się przy starcie systemu. Jest mało prawdopodobne, że ta aktywność zostanie kiedykolwiek uruchomiona ponownie.

Usługa ustawi alarm, aby cyklicznie wyłączał się, co spowoduje, że IntentService pobierze listę lokalizacji z sieci. Ta IntentService następnie utworzy Geofences wokół tych lokalizacji i utworzy PendingIntents, które będą uruchamiane, gdy zbliżą się lokalizacje. Z kolei te PendingIntents spowodują, że inna IntentService podejmie jakieś działanie.

Wszystko to musi się zdarzyć w tle, bez interakcji użytkownika z wyjątkiem rozpoczęcia działania po raz pierwszy po instalacji. W związku z tym działanie nie będzie oddziaływać z usługą LocationClient ani żadnymi usługami lokalizacyjnymi.

Mam tę konfigurację z urządzeniami proximityAlerts, ale chcę przejść do nowego interfejsu Geofencing API z powodów związanych z żywotnością baterii. Jednak słyszałem, że może być kilka problemów z używaniem LocationClient z poziomu usługi. Konkretnie, co słyszałem (przepraszam, nie ma wzmianki, tylko ze słyszenia roszczeń):

  • lokalizacja klient opiera się na ui dostępności dla obsługi
  • gdy wywołana z wątku tła błędu LocationClient.connect() zakłada, że jest wywoływany z głównego wątku interfejsu (lub innego wątku z looperem zdarzeń), więc wywołanie połączenia nigdy nie jest wywoływane, jeśli wywołujemy tę metodę z usługi działającej w tle wątek

Po zbadaniu nie widzę z jakiegokolwiek powodu, dlaczego tak się stało, lub dlaczego przestałbym robić to, co chcę. Miałem nadzieję, że będzie to prawie zamiennik dla urządzeń nearAlerts ...

Czy ktoś może rzucić trochę światła na rzeczy tutaj?

Odpowiedz

2

Najlepiej byłoby po prostu spróbować, prawda? Twoja strategia wydaje się być dobra.

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. 

Wiem, że to nieprawda. Mam usługę uruchamianą z działania, a wywołanie połączenia jest wywoływane.

Nie wiem o alertach zbliżeniowych; ale nie mogę znaleźć API do listy moich GeoFences. Martwię się, że moja baza danych (sqlite) i faktyczne ogrodzenia mogą zostać zsynchronizowane. Jest to moja wada konstrukcyjna.

Powodem, dla którego LocationClient potrzebuje interfejsu użytkownika, jest to, że urządzenie może nie mieć zainstalowanych Usług Google Play. Firma Google opracowała sprytny i złożony mechanizm, który pozwala Twojej aplikacji na monitowanie użytkownika o jej pobranie. Cała ta rzecz jest okropna i okropna w mojej opinii. To wszystko programowanie "co, jeśli-jeśli".

(Oni rzucili dużo rzeczy za drzwi dla google IO 2013. Nie wszystkie z nich są dobrze udokumentowane, a niektóre z nich wydaje się nieco "szorstki dookoła krawędzi").

+0

Nie mogłem znaleźć i API do listy Geofences, i chciałbym również mieć jeden. Martwię się również, że mój sqlite db i faktyczna lista zarejestrowanych ogrodzeń jest zsynchronizowana ... –