如果不能保证调用 onDestroy() ,为啥要实现它?
Posted
技术标签:
【中文标题】如果不能保证调用 onDestroy() ,为啥要实现它?【英文标题】:Why implement onDestroy() if it is not guaranteed to be called?如果不能保证调用 onDestroy() ,为什么要实现它? 【发布时间】:2011-09-01 07:40:47 【问题描述】:根据 android Activity 生命周期,唯一保证被调用的回调(如果 Activity 离开运行状态,这通常是预期的)是 onPause()
。
因此,我必须假设在某些情况下实现 onStop()
和 onDestroy()
是有意义的,尽管它们并没有真正保证被调用。
我知道,当 Activity 可以通过 Stopped 状态返回到 Running 状态时,应该实施 onStop()
(为什么要这样做而不是直接返回是另一个问题)。
但我不清楚是否需要 onDestroy()
,我可以将所有清理/状态保存放入 onPause()
。
您能否描述一个实际应用情况(即不类似于驾驶汽车等),在这种情况下实现onDestroy()
是有意义的?
【问题讨论】:
因为正常情况下会调用onDestroy()。只是它不保证被调用。例如,如果您的进程被 oom 杀手杀死。 @Falmarri 但是一个编写良好的应用程序应该针对最坏的情况而设计。您是在暗示在正常情况下会提高性能吗? 你为什么使用那个图表(2008!?)而不是official one?这是自 1.5 以来发生了很大变化的一件事。 我没有暗示什么。只需注意在 NORMAL 生命周期下它将被调用,您可以将其用作预期逻辑流的一部分。但正如你所说,你也应该优雅地处理最坏的情况。这并不意味着您应该只针对最坏的情况编写代码。 【参考方案1】:onDestroy 如果你显式调用finish(); 将被调用。自己。
您的主要活动在地图活动上调用 startActivityForResult。
带有 LocationListener 的地图活动,用户单击地图并选择当地餐馆。
然后,活动设置一些附加内容以发送回您的主要活动,然后显式调用完成();在其自身和 onDestroy 中杀死 LocationListener 和您调用的其他变量。
刚刚在文档中找到了这个
onDestroy() = 在销毁活动之前收到的最后一次调用。这可能是因为 Activity 正在完成(有人在其上调用了 finish(),或者因为系统正在临时销毁该 Activity 实例以节省空间。您可以使用 isFinishing() 方法区分这两种情况。
【讨论】:
+1 指出这一点。这是否意味着如果我从不调用finish()
,onDestroy()
就无法实现?
你可以实现它。 onDestroy 将在其他点被调用(当您的应用程序在后台并被操作系统杀死时)。
正如@Poldie 所说,当您的活动被杀死并重新创建时(当您的活动在被移动的手机上从纵向变为横向时),也会调用 onDestroy。
这是有道理的,但不能完全回答。我可以看到可以使用 onDestroy 的情况,但是我们如何处理其余的?在给定的示例中,如果 Activity 被终止并且未调用 onDestroy 会发生什么......看起来 LocationListener 不会被销毁,因为我们依赖 onDestroy 来执行此操作。更好的例子:我有一个在 Activity 中运行的 AsyncTask。它下载图像。我在 onDestroy 中取消它(因为 onStop 不合适,只要应用程序最小化就会调用它)。那么如果 Activity 被“杀死”了呢?任务会继续运行吗?
这不是问题的答案。 OP实际上问为什么使用onDestory
如果可以在onPause
中使用isFinishing()
?【参考方案2】:
你能描述一个真实的应用情况吗 (即不类比驾驶汽车 等),这将是有意义的 实现 onDestroy()?
当您想要捕获配置更改时。这一切都在 SDK 中: http://developer.android.com/reference/android/app/Activity.html
【讨论】:
以上是关于如果不能保证调用 onDestroy() ,为啥要实现它?的主要内容,如果未能解决你的问题,请参考以下文章