2009-05-28 10 views
5

Pracuję z Android od ponad roku, ale nadal mam problem z określeniem, kiedy należy używać różnych typów komunikatów/komunikacji między procesami/wątkami. Mówię głównie o emisji Intents, używając AIDL dla services, używając Handlerów do wysyłania wiadomości i komunikacji z gniazdem.Kiedy należy używać każdego z różnych typów wiadomości systemu Android?

Wiele z tych narzędzi można wykorzystać do wykonywania podobnych zadań, ale które lepiej pasują do konkretnych sytuacji?

Odpowiedz

14

To jest dość otwarte pytanie, ale pozwólcie, że rzucę okiem na to, jak najlepiej sprawdza się komunikacja między aplikacjami.

Jednym z kluczowych aspektów przesyłania wiadomości Android jest koncepcja luźnego powiązania wszystkich składników aplikacji. Ponieważ wszystkie aplikacje działają w oddzielnym procesie, a jedna "aplikacja" może składać się z kilku aplikacji (odpowiedzialnych za zapewnienie różnych działań lub usług), wszystkie techniki przesyłania wiadomości opierają się na idei przekazywania komunikatów przez granice procesów.

Intents

Preferowaną techniką wiadomości, zawsze staram się użyć Intent miarę możliwości. Jest to najbardziej "natywny" sposób przesyłania wiadomości w systemie Android.

Zalety

Korzystanie z intencjami do wiadomości utrzymuje luźne wiązanie komponentów aplikacji, pozwalając na przesyłanie wiadomości płynnie pomiędzy kilkoma aplikacjami. Intencje są używane w głównym systemie do uruchamiania działań i usług oraz do nadawania i odbierania zdarzeń systemowych.

Używanie dodatków Wiązki mogą zawierać pary klucz/wartość prymitywów jako dane ładunku w Intencjach, aby łatwo przekazywać informacje z jednego komponentu aplikacji do drugiego - nawet jeśli te komponenty działają w różnych procesach.

Wady

Ponieważ Intents są zaprojektowane, aby przejść między procesami, ładunek dodatki wspiera jedynie prymitywne typy. Jeśli chcesz wysłać obiekt za pomocą intencji, musisz go rozebrać na prymitywy na jednym końcu i zrekonstruować go na drugim.

Klasa Application

Jeśli chcesz tylko do komunikowania się w obrębie jednej aplikacji działającej w pojedynczym procesie jest to wygodne rozwiązanie.

Zalety

rozszerzając klasę Application (i wdrożenia go jako Singleton) uzyskać obiekt, który będzie istniał gdy dowolnych komponentów aplikacji istnieje, zapewniając scentralizowane miejsce do przechowywania i przenoszenia złożonych danych obiektów między komponentami aplikacji.

Wady

Ta technika ogranicza wiadomości do elementów w jednej aplikacji.

usługi Binding, IPC i AIDL

Wiązanie z serwisu umożliwia dostęp do jego metod i obiektów wymiany z nim. AIDL jest sposobem definiowania sposobu serializacji obiektu na prymitywy systemu operacyjnego, tak aby można go było przekierowywać poza granice procesu, jeśli usługa, do której się łączysz, działa w oddzielnej aplikacji.

Zalety

Kiedy powiązanie z usługą masz dostęp do niego tak, jakby to był obiekt w obrębie klasy wywołującego. Oznacza to, że możesz uruchamiać metody w usłudze i wymieniać się z nim bogatymi obiektami.

Należy pamiętać, że jeśli wiążesz Usługę w innym procesie aplikacji, musisz utworzyć definicje AIDL, które powiedzą Androidowi, jak serwować/deserializować obiekty, które chcesz przekazać między aplikacjami.

Wady

Tworzenie klas AIDL dla IPC jest trochę dodatkowej pracy, a wiązanie tworzy dodatkowe zależności między usług i działań, które mogą utrudnić dla jądra, aby oczyścić zasobów, gdy inne aplikacje są poddawane zagłodzony.

Przekazywanie wiadomości przez granice procesów jest jednak kosztowne. Więc jeśli nie wykonujesz metod w Usłudze, używanie bindowania i IPC jest prawdopodobnie przesadą - zobacz, czy możesz osiągnąć to samo za pomocą Intents.

Gniazdka

Jeśli uciekania się do gniazd do komunikowania się wewnątrz lub pomiędzy aplikacjami działającymi na jednym urządzeniu, to albo dlatego, że nie ma innego sposobu lub przeoczyłeś trick gdzieś. Jeśli twoje wiadomości opuszczają urządzenie, gniazdka są dobrym, szybkim, alternatywnym rozwiązaniem. Jeśli pozostaniesz na urządzeniu, szanse na to, że Intents lub IPC będą lepszą opcją.

+0

+1 to idealna odpowiedź, która może być używana jako standardowa odpowiedź w całej społeczności ..... – aProgrammer

1

Moje 2 centów

  • Nie używałem lokalnych gniazdek. Wygląda na przesadę, ponieważ musisz wygenerować i przeanalizować dane, aby uzyskać .
  • Intents są zarówno dla rzeczy, które inne aplikacje mogą chcieć zrobić (rozpoczęcie mnie w oknie tworzenia wiadomości lub odebrać coś)
  • AIDL/Paczki/koparki za posiadanie rozmowy GUI do bezgłowe procesu działa stale. W zależności od aplikacji, wiele transferu danych może się zdarzyć przy użyciu dostawcy zawartości , ale mam tendencję do przesyłania niektórych danych , które należy przesłać poza kanał .
2

Wszystko zależy od przypadku zastosowania i rodzaju aplikacji.Jeśli aplikacja działa cały czas lepiej, aby przejść z podejściem AIDL, ponieważ jest to najbezpieczniejszy sposób komunikacji. Jeśli aplikacja nie musi być cały czas uruchamiana, możesz użyć zamiaru transmisji lub oczekującego podejścia do komunikacji między aplikacjami.

Powiązane problemy