2010-03-19 6 views
7

Pracuję nad ustanowieniem dwukierunkowej komunikacji między działaniem a usługą, która działa w innym procesie.Jak ustanowić dwukierunkową komunikację pomiędzy Działalnością a Usługą w innym procesie?

Zapytanie o proces z działania nie jest wielkim problemem. Chcę jednak, aby proces powiadamiał działanie o zdarzeniach. Pomysł polega na tym, że usługa działa niezależnie od rzeczywistej aplikacji. Okresowo odpytuje serwer sieciowy. Jeśli na serwerze internetowym zostanie znalezione nowe zadanie, proces powinien powiadomić o tym działaniu.

Znalazłem this thread na AndDev.org, ale nie wydaje się to dla mnie działać. Robiłem sobie z BroadcastReceiver. Zaimplementowałem interfejs, który powinien powiadamiać o działaniu, ale problem polega na tym, że detektor jest zawsze zerowy, ponieważ transmisja z procesu odbywa się za pomocą funkcji Intent, dlatego klasa, która rozszerza program BroadcastReceiver, zostanie nowo utworzona.

Jak mogę ustanowić dwukierunkową komunikację? To musi być możliwe. Dzięki za wszelką pomoc,

Steff

+0

Czy możesz szczegółowo opisać, w jaki sposób "zapytanie o proces z działania nie jest wielkim problemem"> Dokładnie jak to robisz? Czy jesteś zobowiązany do usługi? – Radu

Odpowiedz

4

Użyj BroadcastReceiver lub wywołaj Activity register a callback or listener object, które wywołają Service dla zdarzeń kluczowych. Powyższe linki zawierają przykładowe projekty demonstrujące każdą z tych technik.

+0

Czy mogę korzystać z usługi BroadcastReceiver w ramach mojej działalności lub czy muszę utworzyć inną klasę? Czy muszę określić klasę rozszerzającą BroadcastReceiver dla intencji? – stfn

+0

'BroadcastReceiver' jest klasą - klasa nie może być zarówno" Aktywnością ", ani" BroadcastReceiver ". Możesz użyć wewnętrznej klasy swojego 'Activity' dla' BroadcastReceiver', jak pokazano w przykładowym kodzie powiązanym z powyższym. Możesz użyć nazw komponentów dla swojej audycji 'Intents', ale wymaga to publicznej klasy' BroadcastReceiver'. Lub możesz użyć niestandardowych ciągów akcji, jak pokazano w przykładowym kodzie powiązanym z powyższym. – CommonsWare

+0

Dzięki, ale nie jestem pewien, czy BroadcastReceiver jest dobrze dopasowany, ponieważ to, czego chcę, to tak długi proces, który jest niezależny od rzeczywistej aplikacji. Powinien mieć możliwość wyświetlania powiadomienia na pasku stanu, tak jak robi to nowa wiadomość e-mail, nawet jeśli aktualna aplikacja nie działa. Oznacza to, że muszę uruchomić usługę poprzez startService (intent) zamiast bindService (intent, connection, flags), prawda? Próbowałem zrozumieć "RemoteServiceClient" ApiDemos, ale żałośnie nie udało się.Im więcej patrzę na "przykłady", tym bardziej zdezorientowany dostaję ... – stfn

2

Myślę, że powinieneś mieć BroadcastReceiver rozpocznie swoją działalność dzięki wyniku w intencyjnego.

Lub możesz użyć AIDL o AIDL. Próbki mają również (wiele?) Przykład użycia AIDL i usług. Ale AIDL może być dużym kłopotem dla twojego celu.

+0

... Rozpocznij moją aktywność PONOWNIE? Właśnie tego staram się uniknąć ... AIDL to naprawdę kłopot, ale wydaje się, że droga do niego. Teraz próbuję zrozumieć RemoteServiceBinding z ApiDemos. Trudny. – stfn

2

Musisz użyć BroadcastReceiver, aby otrzymać intencje, a kiedy chcesz się komunikować, po prostu zrób intencję z odpowiednimi wartościami.

W ten sposób powinieneś być w stanie wykonać dwukierunkową komunikację między dowolnymi komponentami.

+0

Czy możesz szczegółowo odpowiedzieć na tę odpowiedź? Więc zaimplementowałeś BroadcastReceiver w usłudze i inny w działaniu? I wysłał Intents z obu stron? Czy mogę używać LocalBroadcastReceiver zamiast BroadcastReceiver? – Radu