Mam usługę, która cały czas sprawdza nowe zadanie. Jeśli pojawi się nowe zadanie, chcę odświeżyć interfejs użytkownika, aby wyświetlić te informacje. Znalazłem https://github.com/commonsguy/cw-andtutorials/tree/master/18-LocalService/ ten przykład. Czy to dobre podejście? Jakieś inne przykłady?
Dzięki.
Odpowiedzi:
Zobacz poniżej moją pierwotną odpowiedź - ten wzorzec zadziałał dobrze, ale ostatnio zacząłem stosować inne podejście do komunikacji Usługi / Działania:
Użyj RxJava do wykonywania operacji asynchronicznych.
Jeśli usługa musi kontynuować operacje w tle, nawet jeśli nie jest uruchomiona żadna aktywność, uruchom ją również z klasy Application, aby nie została zatrzymana po odłączeniu.
Zalety, jakie znalazłem w tym podejściu w porównaniu z techniką startService () / LocalBroadcast, to
Przykładowy kod. Najpierw usługa:
Oraz działanie, które wiąże się z usługą i otrzymuje aktualizacje wysokości ciśnieniowej:
Układ tego działania to:
Jeśli usługa musi działać w tle bez powiązanego działania, można ją uruchomić z klasy Application, a także
OnCreate()
za pomocąContext#startService()
.Moja oryginalna odpowiedź (od 2013):
W twojej usłudze: (używając COPA jako usługi w przykładzie poniżej).
Użyj LocalBroadCastManager. W usłudze onCreate skonfiguruj nadawcę:
Jeśli chcesz powiadomić interfejs użytkownika o czymś:
W Twojej aktywności:
Utwórz odbiornik w onCreate:
i zarejestruj go w onStart:
źródło
onStart()
lubonResume()
metody. Ogólnie rzecz biorąc, jeśli działanie prosi Usługę o zrobienie czegoś, ale kończy pracę przed otrzymaniem wyniku, rozsądne jest założenie, że wynik nie jest już wymagany. Podobnie przy rozpoczynaniu działania należy przyjąć, że usługa nie obsługuje żadnych zaległych żądań.dla mnie najprostszym rozwiązaniem było wysłanie transmisji, w działaniu oncreate zarejestrowałem i zdefiniowałem transmisję w ten sposób (updateUIReciver definiuje się jako instancję klasową):
A z usługi wysyłasz taką intencję:
nie zapomnij wyrejestrować odzysku z działania przy niszczeniu:
źródło
Chciałbym użyć związanego usługi to zrobić i komunikować się z nim poprzez wprowadzenie słuchacza w mojej działalności. Jeśli więc Twoja aplikacja implementuje myServiceListener, możesz zarejestrować ją jako nasłuchiwanie w swojej usłudze po powiązaniu z nią, zadzwoń do listener.onUpdateUI z powiązanej usługi i zaktualizuj interfejs użytkownika!
źródło
Polecam wypróbowanie Otto , EventBusa dostosowanego specjalnie do Androida. Twoja aktywność / interfejs użytkownika może słuchać wydarzeń publikowanych w magistrali z usługi i odłączać się od zaplecza.
źródło
Rozwiązanie Clyde'a działa, ale jest to transmisja, która, jestem prawie pewien, będzie mniej wydajna niż bezpośrednie wywołanie metody. Mógłbym się mylić, ale myślę, że transmisje są przeznaczone bardziej do komunikacji między aplikacjami.
Zakładam, że wiesz już, jak powiązać usługę z działaniem. Robię coś w rodzaju poniższego kodu, aby poradzić sobie z tego rodzaju problemem:
Pominąłem końcówki do zabezpieczania nici, co jest niezbędne. Upewnij się, że używasz blokad lub czegoś podobnego podczas sprawdzania i używania lub zmieniania odniesień do fragmentów w usłudze.
źródło
źródło
Moje rozwiązanie może nie jest najczystsze, ale powinno działać bez problemów. Logika polega po prostu na utworzeniu zmiennej statycznej do przechowywania danych
Service
i aktualizowaniu widoku co sekundę w plikuActivity
.Powiedzmy, że masz
String
na swojejService
karcie, którą chcesz wysłać do aTextView
na swojejActivity
. To powinno wyglądać takTwoja usługa:
Twoja Aktywność:
źródło
android
tak, jeśli jest to lista, spróbuj utworzyć adapter lub utrwalić dane za pomocą sqllite / realm db.