如果您使用活动在onCreate(Bundle)中注册接收者 在上下文中,您应该在onDestroy()中取消注册它以防止泄漏 接收者离开活动背景。如果您注册接收器 在onResume()中,您应该在onPause()中取消注册以防止它 多次注册(如果你不想接收广播 暂停时,这可以减少不必要的系统开销。)
我从官方文档中得到了这个。为什么我们说"如果我们在onCreate()中注册一个接收器,我们应该在onDestroy()&#34中取消注册?
答案 0 :(得分:2)
您应该在注册接收器的相应事件中取消注册接收器。这将防止以不平衡的方式注册/取消注册。
例如,假设您在onCreate
注册了它,但是您在onPause
中取消注册。您的活动已创建并注册接收者。然后你会显示一个对话框。调用onPause
并取消注册接收器。现在对话框被解雇了。调用onResume
并继续您的活动。但它没有重新创建,onCreate
将不会被调用,而您的接收者已经取消注册,您将不再在此活动中获得广播。
这就是使用正确的生命周期事件对的重要性。
对你提到的那些事件的一点解释:
创建onCreate
时会发生Activity
,进入前景时会onResume
。当离开前景时,相应的结束事件为onPause
,例如,对话框部分覆盖Activity
或用户导航远离Activity
,另一个一个完全覆盖它(在这种情况下,onStop
也将被调用)。如果Activity
由于配置更改(例如,旋转)而被销毁,或者系统回收它,则会调用onDestroy
。
这里有点偏离:特别关于onCreate
/ onDestroy
,我会避免那对广播接收者注册。原因是onDestroy
可能需要很长时间才能被调用或者可能永远不会被调用(根据Android规范,不能保证,可以在不调用onDestroy
的情况下收集活动的内存)。另一个例子:您的活动已创建,您注册了接收者。然后,您从该活动导航到另一个活动。它接收onPause
然后onStop
,您正在进行另一项活动,但之前的活动仍在收听广播。
答案 1 :(得分:1)
第一次创建1 - 如果您在onCreate(Bundle)中注册接收器使用 活动的上下文,您应该在onDestroy()中注销它以防止 将接收者泄露出活动背景
onCreate()
时会调用Activity
的{{1}},Activity
的{{1}}被调用onDestry()
被摧毁了。这两个函数在Activity
的生命周期中仅被调用一次。
因此,如果您在Activity
注册 Activity
,那么您必须<{1}} 取消注册,以便在broadcastReceiver
被销毁后,已注册的onCreate()
不会影响到其他onDestroy()
。
每当2 - 如果在onResume()中注册接收器,则应取消注册 在onPause()中防止多次注册
broadcastReceiver
活动且可见时调用 Activity
,只要此Activity
为<,就会调用onPause()强>不可见或无效。
因此,如果您在onResume()
中注册 Activity
,则只要Activity
可见且,就会调用此方法有效,因此会在broadcastReceiver
的一个生命周期中多次注册,因此您必须在onResume()
中致电Activity
,每当Activity
隐身且无效时,取消注册注册的收件人。