如果不能保证调用 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() ,为啥要实现它?的主要内容,如果未能解决你的问题,请参考以下文章

super this 为啥不能同时存在

onDestroy() onTaskRemoved 两者都不能在 Redmi MI 设备上运行

混合方式开启服务

CRC校验为啥能够保证数据的准确性(出错率很低很低)

volatile为啥不能保证原子性

为啥“基类对象”不能调用它自己的虚函数? C++