2011-10-24 36 views
7

Piszę prosty odbiornik transmisji. Zarejestrowałem odbiorców zarówno w manifeście, jak iw kodzie wcześniej. Dla moich celów jest to prosty odbiornik, który nie musi robić nic nadzwyczajnego.Czy lepiej jest zarejestrować się w odbiorniku w manifeście lub w kodzie?

Czy istnieje jeden powód, aby wybrać jedną metodę zamiast drugiej w tym przypadku? Czy rejestracja odbiorcy w manifeście jest bardziej wydajna (wykonuje się szybciej)? Czy oba są w zasadzie takie same?

Pytam, ponieważ aplikacja, którą piszę, musi być bardzo wydajna i nie byłem w stanie znaleźć dobrych informacji na temat praktycznej różnicy między tymi dwiema metodami. Próbuję podążać za najlepszą praktyką kodowania.

Pozdrowienia

Odpowiedz

8

Cóż, w rzeczywistości są różne. Wydaje się, że myślisz, że to prawie to samo. Kiedy rejestrujesz odbiornik w kodzie, musisz go wyrejestrować, gdy aplikacja zostanie zniszczona (w rzeczywistości, gdy zostanie zarejestrowana, Activity lub Service, zostanie zniszczona). Z drugiej strony, gdy zadeklarujesz to w manifeście, udostępnisz go, nawet jeśli aplikacja nie działa.

Po prostu zadaj sobie pytanie: które z dwóch podejść najlepiej pasuje do Twoich potrzeb?

+0

interesujące. Dzięki. Nadal brzmią bardzo podobnie do mnie, nie jest trudno kontrolować, kiedy zarejestrować/wyrejestrować odbiornik. Także jeśli uruchamiasz odbiornik w usłudze, zadziała, jeśli aplikacja nie działa. Czy mówisz, że gdyby to nie była usługa, odbiornik działałby, gdyby aplikacja nie była uruchomiona, jeśli zaimplementowana w manifeście? To nie jest w porządku. – Dave

+0

Tylko jedno wyjaśnienie ... jeśli usługa jest uruchomiona: aplikacja ** działa **. – Cristian

+0

aha Właśnie miałem chwilę kliknięcia. Dzięki Cristian! – Dave

2

Nie mogę mówić o skuteczności wdrożenia jednego z drugim (moja intuicja podpowiada mi, że jest zbyt blisko, aby naprawdę mieć znaczenie), ale z powodów wskazanych w odpowiedzi Cristiana, rejestracja i wyrejestrowanie programowe może spowodować Twoja aplikacja jest bardziej wydajna.

Jeśli zarejestrujesz się w manifeście, twój odbiornik będzie zawsze budzony przez dowolne zamiary pasujące do twoich filtrów. Jeśli zarejestrujesz programowo, możesz pozwolić, aby Twój odbiornik był budzony w określonym czasie i możesz kontrolować, które intencje będą budzić odbiornik i kiedy.

Jeśli naprawdę martwisz się budzeniem odbiornika w chwilach, w których nie musi być, to rób to programowo w kodzie. Musisz być bardziej ostrożny, aby zawsze się wyrejestrować i upewnić się, że Twój odbiornik jest zarejestrowany przez cały czas, którego oczekujesz, ale jeśli zrobisz to poprawnie, możesz uniknąć niepotrzebnego budzenia się z odbiornika, a tym samym zaoszczędzić trochę wydajności .

+0

Podoba mi się pomysł dodatkowej kontroli, kiedy odbiornik jest aktywny, czy też nie. Dzięki. – Dave

0

To zależy od scenariusza.

kiedy użyć którego metody zarejestrować

Która metoda używać do rejestracji Twojego BroadcastReceiver zależy co aplikacja robi ze zdarzeniem systemowym. Myślę, że istnieją dwa powody, dla których aplikacja chce wiedzieć o wydarzeniach całego systemu:

  1. Twoja aplikacja oferuje jakieś usługi wokół tych wydarzeń

  2. Twoja aplikacja chce łaskawie reagować na zmiany stanu

Przykładami pierwszej kategorii są aplikacje, które muszą działać natychmiast po uruchomieniu urządzenia lub muszą rozpocząć jakąkolwiek pracę, gdy tylko aplikacja jest zainstalowana. Battery Widget Pro lub App2SD to dobre przykłady dla tego rodzaju aplikacji. Dla tego typu należy zarejestrować BroadcastReceiver w pliku Manifest.

Przykładami drugiej kategorii są zdarzenia sygnalizujące zmianę okoliczności, na których aplikacja może polegać. Powiedz, że Twoja aplikacja zależy od nawiązanego połączenia Bluetooth. Musisz reagować na zmianę stanu - ale tylko wtedy, gdy aplikacja jest aktywna. W tym przypadku nie ma potrzeby statycznego rejestrowania odbiornika. Dynamicznie zarejestrowany byłby bardziej uzasadniony.

Istnieje również kilka zdarzeń, na które nie można się zarejestrować statycznie. Przykładem tego jest zdarzenie Intent.ACTION_TIME_TICK transmitowane co minutę. Co jest mądrą decyzją, ponieważ statyczny odbiornik niepotrzebnie wyczerpałby baterię.

0

Upraszczając

dynamicznej rejestracji - Twoja aplikacja oczekuje coś się stało natychmiast, podczas gdy aplikacja jest uruchomiona

rejestracji statycznej - Ty aplikacja czeka na coś się wydarzy na dłuższą metę. A ponieważ nie można zagwarantować, Twoja aplikacja zostanie uruchomiona, gdy zdarza się, można grzecznie poprosić android system powiadamiania robi

Oni obaj mają taką samą realizację poza tym punkcie

+0

Witamy w Stack Overflow! Zachęcamy do wzięcia udziału w [wycieczce] (// stackoverflow.com/tour) witryny, a jeśli potrzebujesz dodatkowej pomocy na stronie, sprawdź [to] (// stackoverflow.com/help). Aha, i jeśli kiedykolwiek napotkasz problemy, których strona pomocy nie obejmuje, możesz poprosić o [meta] (// meta.stackoverflow.com/). –

+0

Pamiętaj też, że to pytanie ma prawie 6 lat, a jeśli zostało wysłane teraz, bardzo szybko zostanie przeniesione na [SoftwareEngineering.SE] (https://softwareengineering.stackexchange.com/). Z tego powodu go obniżam, ale proszę, nie bierz tego osobiście. :-) –

+0

Och, więc czy powinienem był spróbować przenieść pytanie? Lub po prostu nie odpowiadać na stare pytania, bez względu na wszystko? – cagney