5

我试图了解等到onDestroy取消注册听众是否有任何潜在危害。我特别指的是取消订阅事件总线(otto),但相信答案适用于大多数listener pattern实现(SharedPreferenceListener、、引用等)LocationListenerstatic

我已经看到了这个问题的其他几个 答案,引用了“不保证调用 onDestroy”这个短语。完整的onDestroy 文档文本实际上是:

注意:不要指望这个方法被称为保存数据的地方!例如,如果一个活动正在内容提供者中编辑数据,那么这些编辑应该在 onPause() 或 onSaveInstanceState(Bundle) 中提交,而不是在这里。此方法通常用于释放资源,例如与活动关联的线程,以便在其应用程序的其余部分仍在运行时,被破坏的活动不会留下这些东西。在某些情况下,系统会简单地终止 Activity 的宿主进程,而不会在其中调用此方法(或任何其他方法),因此不应使用它来执行打算在进程消失后保留的事情。

我理解这意味着onDestroy不应将其用于保存数据,因为在应用程序进程被终止之前可能不会调用它(如生命周期图所示)。

简而言之,是否存在由于未调用 onDestroy 而导致注册为侦听器的 Activity 泄漏的情况?

4

1 回答 1

5

是否存在由于未调用 onDestroy 而导致注册为侦听器的 Activity 泄漏的情况?

不是我能想到的。但是,这与以下内容不同:

在 onDestroy 中取消注册听众 - 有什么害处?

在早期的生命周期方法(例如onPause()/ onStop())中取消注册侦听器的原因是,当 Activity 不在前台时,它不需要这些事件。

您的应用程序已经必须处理活动被破坏的情况,例如用户按下 BACK 按钮,但随后用户返回到应用程序中的同一位置。您将需要创建一个新的活动实例,并且该活动实例将需要从某个数据源获取它需要显示的任何内容。因此,如果代码有效,您可以使用相同的“获取所需的任何内容”逻辑在现有活动实例返回前台时对其进行刷新。IOW,就您获取数据的位置而言,将返回的活动与新创建的活动区别对待。

于 2014-04-07T23:01:25.080 回答