在onCreate / onDestroy上注册/取消注册BroadcastReceivers

时间:2014-05-24 14:48:26

标签: android

我在我的一些活动中使用本地BroadcastReceivers来处理通过LocalBroadcastManager发送的广播。我看到许多建议(例如here)建议不在onCreate / onDestroy活动处理程序中注册/取消注册这些接收器。

我不明白为什么。 "官方"解释是每次活动被销毁时都不能保证onDestory被调用:

  

"在某些情况下,系统会在不调用此方法(或其他任何方法)的情况下简单地终止活动的托管过程......"

没有杀死托管流程"意味着对整个活动进行全面清理。资源?这次清理是否包括本地注册的接收器?为什么这个建议不适用于其他本地定义的对象?为什么他们会被保证清理,而BroadcastReceivers却没有?

欣赏您的知识建议。

2 个答案:

答案 0 :(得分:2)

  

我不太明白为什么。

活动中LocalBroadcastManager的常见用法仅需要在活动位于前台时接收广播。因此,onResume() / onPause()是这些方案的正确选择。

如果您认为在onCreate() / onDestroy()中注册/取消注册是您想要做的事情,并且这样做不会对用户造成伤害(例如,浪费CPU时间处理无关事件),那么欢迎这样做。

  

没有杀死托管流程"意味着对整个活动进行全面清理。资源?

是的,确实如此。

  

这次清理是否包括本地注册的接收器?

是的,确实如此。

  

为什么这个建议不适用于其他本地定义的对象?

确实如此。

答案 1 :(得分:1)

  

我不明白为什么。 "官方"解释是   每次活动时都不保证会调用onDestory   毁

就像文档解释一样。可能存在极端情况,系统必须摆脱您的Activity以释放一些资源并在不调用onDestroy()的情况下将其删除

  

没有杀死托管流程"意味着整体而言   清理整个活动'资源?

正确。

  

这次清理是否包括本地注册的接收器?

正确。

  

为什么这个建议不适用于其他本地定义的   对象?为什么他们保证被清理干净   BroadcastReceivers不是吗?

如果Activity被杀,它们将全部从内存中清除。

只是澄清一下。人们建议在Camera中取消注册接收者(或onPause()实例之类的其他组件),因为它是第一个可以放心释放已使用资源的地方,因为它们不会在Activity中使用onPause()执行后再进行。就像扎普尔在comment上说的那样。如果Activity被杀,那么如果您在onPause()onDestroy()系统中取消注册,系统将会清除所有内容,这无关紧要。