注册和取消注册广播接收器?

时间:2018-05-19 15:25:51

标签: android

  

如果您使用活动在onCreate(Bundle)中注册接收者   在上下文中,您应该在onDestroy()中取消注册它以防止泄漏   接收者离开活动背景。如果您注册接收器   在onResume()中,您应该在onPause()中取消注册以防止它   多次注册(如果你不想接收广播   暂停时,这可以减少不必要的系统开销。)

我从官方文档中得到了这个。为什么我们说"如果我们在onCreate()中注册一个接收器,我们应该在onDestroy()&#34中取消注册?

2 个答案:

答案 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 隐身无效时,取消注册注册的收件人。

相关问题