2012-01-05 9 views
22

Czy możliwe jest dynamiczne rejestrowanie odbiornika w jednym fragmencie w celu sprawdzenia zmian stanu połączenia? Jeśli tak to jak? Jeśli nie, jakie są sposoby obejścia fragmentów?Dynamic Broadcast Receiver in Fragment

EDYCJA: Aby zarejestrować BroadcastReceiver potrzebujesz Kontekst. Ponieważ fragmenty działają w ramach działań, prawdopodobnie najlepszym sposobem uzyskania kontekstu jest użycie funkcji getActivity(). Jednakże, jak wyjaśnia to niżej gnorsilva, istnieją pewne szczególne przypadki, na które należy zwrócić uwagę.

+0

Możesz pozwolić, aby aktywność hosta obsługiwała transmisję i komunikowała się z fragmentem. – Neil

+0

Czy to nie byłoby działanie i fragment? jedną z zalet fragmentów jest to, że można je ponownie wykorzystać w innych działaniach. to zmniejszyłoby twoją zdolność do robienia tego. Mam taki sam problem w jednej z moich aplikacji i to samo dotyczy wszystkiego, co wymaga kontekstu. W końcu użyłem klasy bazowej aktywności, która hermetyzuje funkcjonalność wymaganą przez fragment. nie usuwa ich całkowicie, ale ułatwia konserwację. – FunkSoulBrother

Odpowiedz

30

user853583 propozycja jest dobra, ale jeśli potrzebujesz dostępu do kontekstu wewnątrz fragmentu należy użyć getActivity().getApplicationContext()

Należy unikać przechodzenia działalność jako kontekst w miarę możliwości jak może to spowodować przecieki pamięci - jakiś obiekt będzie utrzymywać tę aktywność po wywołaniu funkcji onDestroy() i nie będzie zbierać śmieci.

Mimo, że istnieją przypadki, gdy trzeba przekazać działalność jako kontekst - np: list adapterów

dwie rzeczy jednak:

  • ponieważ fragment jest załączony i Odłączony od działania, czasami getActivity() zwraca null - możesz zadzwonić do niego bezpiecznie w pewnych metodach cyklu życia, o których wiesz, że aktywność jest aktywna, np .: onResume()

  • jeśli twój fragment nie r Etain jego wystąpienie czyli jest zniszczona na zmianę orientacji, należy wyrejestrować odbiornik w swoim fragmencie, dla np wewnątrz onPause() lub onDestroy()

+0

Należy pamiętać, że jeśli używasz setDebugUnregister (true) dla odbiornika transmisji, odniesienie do twojego fragmentu będzie zachowane przez cały cykl życia aplikacji. Może to prowadzić do widocznego wycieku pamięci, szczególnie podczas intensywnego użytkowania :) – greg7gkb

3

O ile widzę, nie ma możliwości zarejestrowania BroadcastReceiver w fragmencie. Do czego jest potrzebny odbiornik? Miłym rozwiązaniem jest jeden wspomniano here

+2

Na oryginalne pytanie należy posłuchać audycji wysłanych przez system - w tym przypadku transmisje łączność wysyłane, gdy łączy się z siecią Wi-Fi. – Theo

1

Można zarejestrować odbiornik nadawania takiego:. getActivity() registerReceiver (. ..