2010-08-16 12 views
73

natknąłem się na ten termin w android dokumentacji z towarzyszącym definicjiCo to jest program Sticky Broadcast?

Są audycje, których dane są przechowywane przez system po zakończeniu, dzięki czemu klienci mogą szybko odzyskać te dane bez konieczności oczekiwania na następny nadawanie.

Co to znaczy? Czy ktoś może rozwinąć jego użycie na konkretnym przykładzie? Uważam, że musimy poprosić o pozwolenie na wykorzystanie tego zamiaru? Dlaczego tak?

<uses-permission android:name="android.permission.BROADCAST_STICKY"/> - Allows an application to broadcast sticky intents. 

Odpowiedz

96

Proszę przeczytać wyjaśnienia Mark Murphy tutaj: what is the difference between sendStickyBroadcast and sendBroadcast in Android

Oto streszczenie przykładem tego, jak można by użyć transmisji trwałej:

Intent intent = new Intent("some.custom.action"); 
intent.putExtra("some_boolean", true); 
sendStickyBroadcast(intent); 

Jeśli słuchasz tej audycji w działaniu który został zamrożony (onPause), możesz przegapić faktyczne wydarzenie. Pozwala to sprawdzić transmisję po jej uruchomieniu (onResume).

EDIT: Więcej na przyklejanych audycji ...

Również sprawdzić removeStickyBroadcast(Intent), a na API Level 5 +, isInitialStickyBroadcast() do wykorzystania w odbiorniku onReceive.

Nadzieję, że pomaga.

+0

Witam, ja się mylę z transmisją lepką z statyczną rejestracją transmisji. Właśnie przeczytałem gdzieś, że różnica między rejestracją audycji w pliku manifestu i rejestracją programową jest taka, że ​​kolejna nie wyrejestruje audycji, ale pozostanie tam, podczas gdy późniejsza wyrejestruje transmisję w trybie onPause(). –

+0

Uwaga: w większości przypadków należy unikać programów lepkich. Aby uzyskać więcej informacji, zobacz [link w odpowiedzi od @Nikhil_Katre] (http://groups.google.com/group/android-developers/browse_thread/thread/f37e3549a5e1be66?pli=1). – gMale

+0

@Shaista: manifestuj odbiorniki działa nawet wtedy, gdy twoja aplikacja jest uśpiona, natomiast programowy odbiornik odpowiada tylko wtedy, gdy aplikacja, w której jest zarejestrowany, działa – gMale

20

Należy pamiętać, że transmisje Sticky są ciężkie w systemie i są odradzane. Przeczytaj notatkę od hackbod w dyskusji na temat 'Sticky Broadcasts and Concurrency Options' w grupie Android Developers.

@Shouvik, Proszę podać dokładny scenariusz, w którym zamierzasz używać StickyBroadcasts. Ktoś może zaproponować alternatywne rozwiązanie.

+0

+1 za wskazanie wadliwych transmisji, nie wspominając o tym, że jeśli twoja aplikacja ulegnie awarii (tak, może się to zdarzyć nawet po zapakowaniu wszystkiego metodą try/catch i zarejestrowaniu 'Thread.setDefaultUncaughtExceptionHandler() '), utknąłeś w czymś, co musisz ostrożnie obsłużyć przy następnej inwokacji. W skrócie, podobnie jak SharedPreferences i ContentProvider, może być uciążliwe i zbyt zawiłe. – ateiob

+0

Przez "ciężki system" masz na myśli, że może go spowolnić? Kiedy pojawia się to spowolnienie? Podczas aplikacji, a nawet bez uruchamiania? Aplikacje Adobe AIR są wymagane, aby prosić o pozwolenie, więc jest to coś, czego nie można uniknąć, jeśli programowanie aplikacji AIR, obawiam się. Możesz poprosić o to w swojej aplikacji, jeśli środowisko wykonawcze AIR jest osadzone w aplikacji lub jeśli użytkownik zainstaluje środowisko wykonawcze Adobe AIR, które prosi o takie uprawnienia. – OMA

+0

Oto scenariusz, który próbuję osiągnąć i zastanawiam się, czy uda się osiągnąć lepkie transmisje. Muszę zachować stan usługi w pamięci, nawet jeśli usługa zostanie zabita, i bez dotykania zewnętrznych zasobów, takich jak flash. Mogę to zrobić bez przykrości, ale napotkasz problemy ze współbieżnością, aktualizując stan, jeśli intencje są dostarczane z powrotem do siebie. – Michael

1

Normalny cel transmisji nie jest już dostępny po wysłaniu i przetworzeniu przez system. Jeśli używasz metody sendStickyBroadcast (Intent), intencja jest lepka, co oznacza, że ​​zamiar wysyłania pozostaje w pobliżu po zakończeniu transmisji.

odnieść do mojego bloga: enter link description here

+1

Dodałem wymagane ujawnienie twego autorstwa bloga, z którym łączysz się. Od tej pory * musisz * robić to samemu, albo twoje posty mogą zostać usunięte jako spam. –

7

sendStickyBroadcast() wykonuje sendBroadcast(Intent) znany jako lepki, czyli intencyjny wysyłasz pobyty wokół po emisji jest kompletny, tak aby inni mogli szybko odzyskać te dane za pośrednictwem wartości zwracanej registerReceiver(BroadcastReceiver, IntentFilter). Pod każdym innym względem zachowuje się tak samo jak sendBroadcast(Intent). Jednym z przykładów emisji lepkiej wysyłanych za poś rednictwem systemu operacyjnego jest ACTION_BATTERY_CHANGED. Kiedy zadzwonisz pod numer registerReceiver() dla tej akcji - nawet z wartością zerową BroadcastReceiver - otrzymujesz intencję, która była ostatnio transmitowana dla tej akcji. Dzięki temu można go użyć do znalezienia stanu akumulatora bez konieczności rejestrowania wszystkich przyszłych zmian stanu akumulatora.

7

Wartość transmisji lepkiej jest wartością, która była ostatnio transmitowana i jest aktualnie przechowywana w lepkim miejscu pamięci podręcznej. To nie jest wartość transmisji, która została teraz odebrana. Przypuszczam, że możesz powiedzieć, że jest to plik cookie przeglądarki, do którego masz dostęp w dowolnym momencie.Lepki transmisja jest już nieaktualna:

Metoda ta została zaniechana na poziomie API 21. Sticky transmisje powinny nie mogą być używane. Nie zapewniają ochrony (nikt nie ma do nich dostępu), ochrony (każdy może je modyfikować) i wielu innych problemów. Zalecany wzorzec polega na użyciu nieprzylepnego komunikatu do zgłoszenia, że ​​coś się zmieniło, z innym mechanizmem dla aplikacji do pobierania aktualnej wartości prądu.

+1

Bardzo pomocne byłoby łącze do przywoływanego dokumentu. –

+0

Nie można zapamiętać przywołanego dokumentu. Nie wiedziałem, że to kiepska etykieta SO, ale teraz wyraźnie widzę dlaczego. Skopiuj kopię i wklej to skądś. –