Muszę utworzyć niestandardowy odbiornik transmisji w zdarzeniu onCreate działania i oczywiście muszę wyrejestrować odbiornik transmisji w zdarzeniu onDestroy działania
Dla jasności jest to fragment kodu, którego używam
public class AnActivity extends Activity {
private ResponseReceiver receiver;
public class ResponseReceiver extends BroadcastReceiver {
public static final String ACTION_RESP =
"mypackagename.intent.action.MESSAGE_PROCESSED";
@Override
public void onReceive(Context context, Intent intent) {
// TODO Start a dialogue if message indicates successfully posted to server
}
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
IntentFilter filter = new IntentFilter(ResponseReceiver.ACTION_RESP);
filter.addCategory(Intent.CATEGORY_DEFAULT);
receiver = new ResponseReceiver();
registerReceiver(receiver, filter);
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
Przeczytałem, że zdarzenia onPause / onResume i onStart / onStop dla tej czynności powinny również rejestrować i wyrejestrowywać odbiornik transmisji.
Naprawdę chcę zrozumieć, co jest uważane za najlepszą praktykę w tym zakresie i dlaczego.
android
broadcastreceiver
jamesc
źródło
źródło
onDestroy()
zostanie wywołany, zdarzenia nie będą już nasłuchiwać przez odbiornik.Odpowiedzi:
Należy zarejestrować i wyrejestrować swoich odbiorców
onStart()
ionStop()
.Jedynym powodem, dla którego Działanie mogłoby zarejestrować
BroadcastReceiver
s, jest wykorzystanie wydarzeń w jakiś sposób w bieżącej aktywności, aby poinformować Użytkownika o zdarzeniu. JeślionStop()
został wywołany,Activity
to nie jest już na pierwszym planie i dlatego nie może zaktualizować użytkownika.Jeśli chcesz odbierać wydarzenia w tle, powinieneś rozważyć skorzystanie z usługi wskazanej tutaj .
Jak mówi Konstantin,
onDestroy()
nie ma gwarancji, że zostaniesz wezwany, i możesz kontynuować odbieranie programów przez długi czas, gdyActivity
nie będzie już otwarty.źródło
Ponieważ
onDestroy()
nie gwarantuje się, że zostaniesz wezwany, skorzystajonPause()
z opcji wyrejestrowania. Weź pod uwagę cykl życia swojego odbiornika telewizyjnego: czy potrzebujesz go, aby był aktywny tylko wtedy, gdy Twoja aktywność jest na pierwszym planie? Następnie użyjonResume()
/onPause()
źródło
Dokumentacja Androida nie określa jednego miejsca do zarejestrowania / wyrejestrowania odbiorników transmisji, ale wspomina zarówno
onStart()
/onStop()
ionResume()
/onPause()
jako możliwości.Najważniejszym czynnikiem przy podejmowaniu tej decyzji jest to, kiedy odbiorca musi być w stanie wykonywać swoją pracę? To określi, kiedy się zarejestrować i wyrejestrować.
Czy odbiorca musi coś zrobić z transmisją tylko wtedy, gdy aktywność jest w centrum uwagi? Jeśli tak, możesz zarejestrować / wyrejestrować go w
onPause()
/onReceive()
. (Możesz również użyć dłuższej żywotności, na przykładonStart()
/onStop()
, ale wtedy powinieneś sprawdzić podczas odbiornika,onReceive()
czy aktywność jest w centrum uwagi.)Czy odbiorca musi coś zrobić, gdy jest widoczny, nawet jeśli nie ma na nim fokusu (np. Podczas pokazywania okna dialogowego)? Jeśli tak, użyj
onStart()
/onStop()
(lub dłuższej żywotności, ale znowu odbiornikonReceive()
powinien sprawdzić, czy aktywność jest widoczna).Czy odbiorca musi wiedzieć o transmisji, nawet jeśli aktywność nie jest widoczna? Na przykład, czy musi pamiętać, że coś się wydarzyło, aby gdy aktywność stała się widoczna, mogła odzwierciedlać wynikający z niej stan rzeczy? Następnie musisz użyć
onCreate()
/,onDestroy()
aby zarejestrować / wyrejestrować. (Zauważ, że istnieją inne sposoby implementacji tego rodzaju funkcji).Jeśli się zarejestrujesz
onStart()
, nie rejestruj ich równieżonResume()
, ponieważ byłoby to zbędne:onResume()
nigdy nie jest wywoływane bez wcześniejszegoonStart()
wywołania.Pamiętaj też, że najlepiej jest pozostawać włączoną pauzę () tak lekką, jak to tylko możliwe :
To prawda, że wywołanie nie
onDestroy()
jest gwarantowane, jeśli system zabije proces w celu zaoszczędzenia pamięci. Jeśli jednak proces zostanie zabity, proces i tak nie będzie odbierał transmisji. W takim razie czy naprawdę konieczne jest wyrejestrowanie odbiorników transmisji?źródło
If you register in onStart(), don't also register them in onPause(), because that would be redundant: onPause() is never called without onStart() being called first.
jest po prostu nielogiczna i myląca, zwłaszcza gdy przyjęta odpowiedź jest całkowicie dokładna.Android może zabić twoją aplikację z pominięciem
onStop()
metody. Najlepszym sposobem rozwiązania tej sytuacji jest zarejestrowanie sięBroadcastReceiver
wonResume()
metodzie i wyrejestrowanie sięonPause()
.źródło
onStop()
aswellPowinieneś zarejestrować i wyrejestrować swoją transmisję za pomocą metod onResume () i onPause ().
jeśli zarejestrujesz się w onStart () i wyrejestrujesz go w onStop (). tym razem otrzymasz następujący numer.
źródło