Chciałbym wiedzieć, jaka jest najlepsza praktyka / sposób programowego zarejestrowania odbiornika. Chcę zarejestrować określone odbiorniki zgodnie z wyborem użytkownika.
Ponieważ rejestracja odbywa się za pośrednictwem pliku manifestu, zastanawiam się, czy istnieje właściwy sposób na osiągnięcie tego w kodzie.
android
broadcastreceiver
CoolStraw
źródło
źródło
Odpowiedzi:
Wygląda na to, że chcesz kontrolować, czy komponenty opublikowane w Twoim manifeście są aktywne, a nie dynamicznie rejestrować odbiornik (przez Context.registerReceiver ()) podczas działania.
Jeśli tak, możesz użyć PackageManager.setComponentEnabledSetting (), aby kontrolować, czy te składniki są aktywne:
http://developer.android.com/reference/android/content/pm/PackageManager.html#setComponentEnabledSetting(android.content.ComponentName, int, int)
Zauważ, że jeśli jesteś zainteresowany otrzymywaniem transmisji tylko podczas biegu, lepiej jest użyć registerReceiver (). Komponent odbiornika jest przydatny przede wszystkim wtedy, gdy musisz mieć pewność, że aplikacja jest uruchamiana za każdym razem, gdy wysyłana jest transmisja.
źródło
W swojej
onCreate
metodzie możesz zarejestrować odbiornik w następujący sposób:Pamiętaj, aby uruchomić to w
onDestroy
metodzie:źródło
onDestroy()
zostanie wywołana, co spowoduje potencjalny wyciek pamięci. Lepiej się zarejestrować / wyrejestrowaćonStart()
/onStop()
.Jedną z ważnych kwestii, o których ludzie zapominają, jest czas życia
Broadcast Receiver
. Różnica między rejestracją programową a rejestracją w AndroidManifest.xml polega na tym. W pliku manifestu nie zależy to od czasu życia aplikacji. Podczas rejestracji programowej zależy to od czasu życia aplikacji. Oznacza to, że jeśli zarejestrujesz się w AndroidManifest.xml , możesz złapać transmitowane intencje nawet wtedy, gdy Twoja aplikacja nie jest uruchomiona.Edycja: wspomniana uwaga nie jest już prawdą od wersji Android 3.1, system Android domyślnie wyklucza wszystkie odbiorniki z odbierania intencji, jeśli odpowiednia aplikacja nigdy nie została uruchomiona przez użytkownika lub jeśli użytkownik jawnie zatrzymał aplikację za pomocą menu systemu Android (w Zarządzaj → Aplikacja). https://developer.android.com/about/versions/android-3.1.html
Jest to dodatkowa funkcja bezpieczeństwa, ponieważ użytkownik może być pewien, że tylko te aplikacje, które uruchomił, będą odbierać intencje transmisji.
Można więc rozumieć, że odbiorniki zarejestrowane programowo w Aplikacji
onCreate()
miałyby taki sam efekt jak te zadeklarowane w AndroidManifest.xml z systemu Android 3.1 powyżej.źródło
Zdefiniuj odbiornik transmisji w dowolnym miejscu w Aktywności / fragmencie w następujący sposób:
Zdefiniuj IntentFilter w
onCreate()
Teraz zarejestruj BroadcastReciever w
onResume()
i wyrejestruj go wonPause()
[ponieważ rozgłaszanie nie jest używane, jeśli aktywność jest wstrzymana].Aby uzyskać szczegółowy samouczek, spójrz na odbiornik transmisji - dwa sposoby implementacji .
źródło
źródło
Według nasłuchiwania i nadawania globalnych wiadomości oraz ustawiania alarmów w typowych zadaniach i jak je wykonywać w systemie Android :
Spójrz na registerReceiver (odbiornik BroadcastReceiver, filtr IntentFilter), aby uzyskać więcej informacji.
źródło
context.registerReceiver
ale nie mogę zadzwonić, proszę, spójrz na to pytanie stackoverflow.com/questions/13238600/ ...Najlepiej jest zawsze podawać pozwolenie podczas rejestracji odbiorcy, w przeciwnym razie otrzymasz je dla każdej aplikacji, która wysyła pasującą intencję. Może to pozwolić złośliwym aplikacjom na nadawanie do odbiornika.
źródło
dla LocalBroadcastManager
i zarejestruj się
onResume
i wyrejestruj to
onStop
i odbierz…
gdzie jest IntentFilter
źródło
Dwie możliwości
registerReceiver(...
) WonStart()
iunregisterReceiver(...)
wonStop()
registerReceiver(...)
wonCreate(...)
iunregisterReceiver(...)
wonDestroy()
Premia:
Jeśli nie chcesz pisać zwykłego kodu do rejestrowania i wyrejestrowywania BroadcastReceiver w każdym działaniu, to
Oto fragment kodu:
Zobacz pełny kod:
TUTAJ
źródło
Utwórz odbiornik transmisji
[BroadcastReceiver (Enabled = true, Exported = false)]
Ze swojej aktywności dodaj ten kod:
źródło