Muszę sprawdzić, czy mój zarejestrowany odbiorca jest nadal zarejestrowany, jeśli nie, w jaki sposób mogę to sprawdzić za pomocą metod?
254
Muszę sprawdzić, czy mój zarejestrowany odbiorca jest nadal zarejestrowany, jeśli nie, w jaki sposób mogę to sprawdzić za pomocą metod?
Odpowiedzi:
Nie jestem pewien, czy interfejs API zapewnia bezpośrednio interfejs API, jeśli weźmiesz pod uwagę ten wątek :
źródło
Brak funkcji API sprawdzającej, czy odbiornik jest zarejestrowany. Obejściem tego problemu jest umieszczenie kodu w pliku
try catch block as done below.
źródło
null
. Ale jak wskazałeś, idę ztry catch
. Śmieszny.najprostsze rozwiązanie
w odbiorniku:
W kodzie:
ad 1
-- w odpowiedzi na:
- Dodano „bardziej eliptyczny sposób” w odbiorniku, aby zarejestrować i ustawić flagę
@amin - zobacz czas życia w kodzie (niezarejestrowany w systemie przez wpis manifestu) zarejestrowany odbiorca :)
źródło
Korzystam z tego rozwiązania
źródło
Masz kilka opcji
Możesz umieścić flagę w swojej klasie lub aktywności. Umieść zmienną boolowską w swojej klasie i spójrz na tę flagę, aby dowiedzieć się, czy masz zarejestrowanego odbiornika.
Utwórz klasę rozszerzającą odbiornik i tam możesz użyć:
Wzorzec singletonu dla tylko jednego wystąpienia tej klasy w twoim projekcie.
Zaimplementuj metody sprawdzania, czy odbiornik jest zarejestrowany.
źródło
Musisz użyć try / catch:
źródło
Możesz to zrobić łatwo ....
1) utwórz zmienną boolowską ...
2) Po zarejestrowaniu odbiornika rozgłoszeniowego ustaw go na PRAWDA
3) W onPause () zrób to ...
Po prostu, a teraz nie otrzymasz więcej komunikatu o błędzie wyjątku na onPause ().
Tip1: Zawsze używaj unregisterReceiver () w onPause (), a nie w onDestroy () Tip2: Nie zapomnij ustawić zmiennej bolBroadcastRegistred na FALSE podczas uruchamiania unregisterReceive ()
Sukces!
źródło
Jeśli umieścisz to w metodzie onDestroy lub onStop. Myślę, że po ponownym utworzeniu działania MessageReciver nie był tworzony.
źródło
Użyłem Intent, aby poinformować Odbiorcę transmisji o wystąpieniu modułu głównego wątku działania programu Handler i użyłem komunikatu, aby przekazać wiadomość do głównej aktywności
Użyłem takiego mechanizmu, aby sprawdzić, czy odbiornik jest już zarejestrowany, czy nie. Czasami jest to potrzebne, gdy rejestrujesz swój odbiornik dynamiczny dynamicznie i nie chcesz, aby był dwa razy lub prezentujesz się użytkownikowi, jeśli odbiornik jest uruchomiony.
Główna aktywność:
Odbiornik transmisji:
źródło
Osobiście używam metody wywoływania unregisterReceiver i połykania wyjątku, jeśli zostanie zgłoszony. Zgadzam się, że to brzydkie, ale najlepsza obecnie dostępna metoda.
Podniosłem żądanie funkcji, aby uzyskać metodę logiczną, aby sprawdzić, czy odbiornik jest zarejestrowany dodany do interfejsu API Androida. Wesprzyj go tutaj, jeśli chcesz, aby został dodany: https://code.google.com/p/android/issues/detail?id=73718
źródło
Rozumiem twój problem, napotkałem ten sam problem w mojej aplikacji. Dzwoniłem registerReceiver () wiele razy w aplikacji.
Prostym rozwiązaniem tego problemu jest wywołanie registerReceiver () w niestandardowej klasie aplikacji. Zapewni to, że odbiornik Broadcast będzie nazywany tylko jednym w całym cyklu życia aplikacji.
źródło
Tak to zrobiłem, jest to zmodyfikowana wersja odpowiedzi udzielonej przez ceph3us i edytowanej przez slinden77 (między innymi usunąłem zwracane wartości metod, których nie potrzebowałem):
Następnie na zajęciach:
źródło
umieszczam ten kod w mojej działalności nadrzędnej
List registerReceivers = new ArrayList <> ();
źródło
Dla mnie działało:
źródło
Oto, co zrobiłem, aby sprawdzić, czy nadawca jest już zarejestrowany, nawet jeśli zamkniesz aplikację (zakończ ())
Przy pierwszym uruchomieniu aplikacji wyślij najpierw transmisję, która zwróci wartość prawda / fałsz, w zależności od tego, czy nadawca nadal działa, czy nie.
Mój nadawca
Moja główna aktywność
źródło
Możesz użyć Sztyletu, aby utworzyć odniesienie do tego odbiornika.
Najpierw podaj:
Następnie wstrzyknij go tam, gdzie potrzebujesz (za pomocą
constructor
lub polainjection
)i po prostu przekażcie to
registerReceiver
.Również włóż to w
try/catch
blok.źródło
źródło
Wystarczy sprawdzić NullPointerException. Jeśli odbiornik nie istnieje, to ...
źródło