我在我的一些活动中使用本地BroadcastReceivers来处理通过LocalBroadcastManager发送的广播。我看到许多建议(例如here)建议不在onCreate / onDestroy活动处理程序中注册/取消注册这些接收器。
我不明白为什么。 "官方"解释是每次活动被销毁时都不能保证onDestory被调用:
"在某些情况下,系统会在不调用此方法(或其他任何方法)的情况下简单地终止活动的托管过程......"
没有杀死托管流程"意味着对整个活动进行全面清理。资源?这次清理是否包括本地注册的接收器?为什么这个建议不适用于其他本地定义的对象?为什么他们会被保证清理,而BroadcastReceivers却没有?
欣赏您的知识建议。
答案 0 :(得分:2)
我不太明白为什么。
活动中LocalBroadcastManager
的常见用法仅需要在活动位于前台时接收广播。因此,onResume()
/ onPause()
是这些方案的正确选择。
如果您认为在onCreate()
/ onDestroy()
中注册/取消注册是您想要做的事情,并且这样做不会对用户造成伤害(例如,浪费CPU时间处理无关事件),那么欢迎这样做。
没有杀死托管流程"意味着对整个活动进行全面清理。资源?
是的,确实如此。
这次清理是否包括本地注册的接收器?
是的,确实如此。
为什么这个建议不适用于其他本地定义的对象?
确实如此。
答案 1 :(得分:1)
我不明白为什么。 "官方"解释是 每次活动时都不保证会调用onDestory 毁
就像文档解释一样。可能存在极端情况,系统必须摆脱您的Activity
以释放一些资源并在不调用onDestroy()
的情况下将其删除
没有杀死托管流程"意味着整体而言 清理整个活动'资源?
正确。
这次清理是否包括本地注册的接收器?
正确。
为什么这个建议不适用于其他本地定义的 对象?为什么他们保证被清理干净 BroadcastReceivers不是吗?
如果Activity
被杀,它们将全部从内存中清除。
只是澄清一下。人们建议在Camera
中取消注册接收者(或onPause()
实例之类的其他组件),因为它是第一个可以放心释放已使用资源的地方,因为它们不会在Activity
中使用onPause()
执行后再进行。就像扎普尔在comment上说的那样。如果Activity
被杀,那么如果您在onPause()
或onDestroy()
系统中取消注册,系统将会清除所有内容,这无关紧要。