我试图了解在onDestroy
取消注册监听器之前是否有任何潜在的危害。我特别指的是取消订阅eventbus(otto),但相信答案适用于大多数listener pattern
实施(SharedPreferenceListener
,LocationListener
,static
引用等)
我已经看到several other answers这个问题引用了“onDestroy不能保证被调用”这个短语。完整的onDestroy
documentation文字实际上是:
注意:不要指望将此方法称为保存数据的地方!例如,如果某个活动正在编辑内容提供程序中的数据,那么这些编辑应该在onPause()或onSaveInstanceState(Bundle)中提交,而不是在此处。通常实现此方法是为了释放与活动相关联的线程之类的资源,以便在其应用程序的其余部分仍在运行时,被破坏的活动不会留下这些东西。在某些情况下,系统会在不调用此方法(或其他任何方法)的情况下简单地终止活动的托管过程,因此不应该使用它来执行在过程消失后仍然存在的事情。
我理解这意味着onDestroy
不应该用于保存数据,因为在应用程序进程被终止之前可能无法调用它(如生命周期图所示)
简单地说,由于没有调用onDestroy,是否存在注册为侦听器的Activity可能会泄露的情况?
答案 0 :(得分:5)
是否存在由于未调用onDestroy而导致注册为侦听器的Activity泄露的情况?
不是我能想到的。但是,这与:
不一样在onDestroy中取消注册侦听器 - 有什么危害?
在早期生命周期方法中取消注册侦听器的原因(例如,onPause()
/ onStop()
)是因为当活动不在前台时,活动不需要这些事件。
您的应用程序已经必须处理活动被销毁的情况,例如用户按下BACK按钮,然后用户稍后返回到应用程序中的相同位置。您将需要创建活动的新实例,并且该活动实例将需要从某些数据源获取它需要显示的任何内容。因此,如果 代码有效,你可以使用相同的"得到它需要的任何东西"当现有活动实例返回到前台时刷新现有活动实例的逻辑。 IOW,根据您获取数据的位置,将返回的活动与新创建的活动区别开来。