Co to jest Sticky Broadcast?

90

Natrafiłem na ten termin w dokumentacji Androida wraz z towarzyszącą definicją

Są to transmisje, których dane są przechowywane przez system po zakończeniu, dzięki czemu klienci mogą szybko odzyskać te dane bez konieczności czekania na następną transmisję.

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.
Shouvik
źródło
3
08 / lutego / 2019, dla każdego, kto szuka Sticky broadcasts should not be used. They provide no security (anyone can access them), no protection (anyone can modify them), and many other problems. The recommended pattern is to use a non-sticky broadcast to report that something has changed, with another mechanism for apps to retrieve the current value whenever desired.
lepszej

Odpowiedzi:

110

Jeśli działanie wywołuje onPausenormalną transmisję, można przegapić odebranie transmisji. Przyklejoną transmisję można sprawdzić po jej zainicjowaniu w onResume.

Aktualizacja 23.06.2020

Przyklejone transmisje są przestarzałe.

Zobacz sendStickyBroadcastdokumentację .

Ta metoda została wycofana na poziomie interfejsu API 21.

Nie należy używać transmisji lepkich. Nie zapewniają żadnych zabezpieczeń (każdy może uzyskać do nich dostęp), żadnej ochrony (każdy może je modyfikować) i wielu innych problemów. Zalecanym wzorcem jest użycie nieprzywierającej transmisji, aby zgłosić, że coś się zmieniło, z innym mechanizmem dla aplikacji do pobierania bieżącej wartości w dowolnym momencie.

Wprowadzić w życie

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

Zasoby

Paul Burke
źródło
Cześć, mylę się z lepką transmisją ze statyczną rejestracją transmisji. Właśnie gdzieś przeczytałem, że różnica między rejestracją audycji w pliku manifestu a rejestracją programową polega tylko na tym, że dalszy program nie wyrejestrowuje audycji tylko tam zostaje, a późniejszy wyrejestrowuje transmisję metodą onPause ().
Shaista Naaz,
Uwaga: w większości przypadków należy unikać lepkich transmisji. Zobacz link w odpowiedzi od @Nikhil_Katre, aby uzyskać więcej informacji
gMale.
@Shaista: Odbiorniki manifestu działają nawet wtedy, gdy aplikacja jest uśpiona, podczas gdy odbiornik programowy odpowiada tylko wtedy, gdy aplikacja, w której jest zarejestrowany, działa
gMale
@gmale Tak więc, jeśli jesteśmy aktywni i jesteśmy w trybie onPause () i wywołaliśmy unregisterReceiver () .. Czy otrzymamy transmisję po wznowieniu w onResume ()
Kushal
1
@PaulBurke Nie znalazłem nazwiska Mark Murphy w powyższym linku. Ten link przekierowuje mnie do pytania, które nie dotyczy dokładnej odpowiedzi. Czy możesz zaktualizować adres URL ?.
Vishal Chhodwani,
11

sendStickyBroadcast()wykonuje sendBroadcast(Intent)tzw. sticky, tj. intencja, którą wysyłasz, pozostaje w pobliżu po zakończeniu transmisji, dzięki czemu inni mogą szybko odzyskać te dane poprzez wartość zwracaną przez registerReceiver(BroadcastReceiver, IntentFilter). Pod każdym innym względem zachowuje się tak samo jak sendBroadcast(Intent). Jednym z przykładów przyklejonej transmisji wysyłanej przez system operacyjny jest ACTION_BATTERY_CHANGED. Kiedy wywołujesz registerReceiver()tę akcję - nawet z wartością null BroadcastReceiver- otrzymasz intencję, która była ostatnio transmitowana dla tej akcji. Dlatego można go użyć do znalezienia stanu baterii bez konieczności rejestrowania wszystkich przyszłych zmian stanu baterii.

Narendra Motwani
źródło
8

Wartość trwałej transmisji to wartość, która była ostatnio transmitowana i jest obecnie przechowywana w lepkiej pamięci podręcznej. To nie jest wartość transmisji, która została teraz odebrana. Przypuszczam, że można powiedzieć, że jest to plik cookie przeglądarki, do którego można uzyskać dostęp w dowolnym momencie. Sticky broadcast jest teraz przestarzałe, zgodnie z dokumentacją dla metod sticky broadcast ( np. ):

Ta metoda została wycofana na poziomie interfejsu API 21. Nie należy używać emisji trwałych. Nie zapewniają żadnego bezpieczeństwa (każdy może uzyskać do nich dostęp), żadnej ochrony (każdy może je modyfikować) i wielu innych problemów. Zalecanym wzorcem jest użycie nieprzywierającej transmisji, aby zgłosić, że coś się zmieniło, z innym mechanizmem dla aplikacji do pobierania bieżącej wartości w dowolnym momencie.

Lou Morda
źródło
3

Normalna intencja emisji nie jest już dostępna po wysłaniu i przetworzeniu przez system. Jeśli używasz metody sendStickyBroadcast (Intent), intencja jest lepka, co oznacza, że ​​wysyłana intencja pozostaje w pobliżu po zakończeniu emisji.

odsyłasz do mojego bloga: tutaj wprowadź opis linku

Arul Pandian
źródło
1
Dodałem wymagane ujawnienie Twojego autorstwa bloga, do którego prowadzi link. Od tej pory musisz to robić samodzielnie, w przeciwnym razie Twoje posty zostaną usunięte jako spam.
Andrew Barber