2

我想知道Android系统是否能够在应用程序最小化时在没有整个应用程序进程的情况下终止活动。从 Android 文档中我们知道,onDestroy只有在 Activity 即将被销毁时才会调用该方法,并且系统保证在即将杀死 Activity 时调用该方法,只有在整个应用程序进程被杀死的情况下才会调用该方法。

所以,想象这样一种情况——你将应用程序发送到后台(最小化),一段时间后操作系统开始内存不足并决定终止活动,但由于应用程序当前被挂起并且无法执行代码它不是能够调用它的onDestroy方法,尽管可以保证在每次活动销毁之前都会调用它。

所以,这种推理让我想到,当应用程序在后台时,操作系统只能杀死整个进程,而不能杀死某些特定的活动。我的推理是正确的,还是我错过了什么?

4

3 回答 3

2

确实如此:当应用程序在后台时,操作系统只能杀死整个进程,但不能杀死某些特定活动。

于 2020-07-20T21:05:30.767 回答
1

你的推理是正确的。

如果用户导航离开活动/应用程序(例如通过按下主页按钮),则称活动处于“停止”状态。(状态为“不存在”、“停止”、“暂停”和“恢复”)。如果 android 内存不足并且需要终止某些进程,它将针对那些活动处于“已停止”状态的进程并终止整个进程(而不是活动)。此外,这样做是不礼貌的,因此不会调用活动的方法。onDestroy()

编辑以下关于进程死亡时保存状态混淆的评论:

如果 Activity 的进程被杀死,系统会在 Activity之外临时保存一组设置,并使用这些设置在下次启动时重新创建该 Activity。

例如,就在移动到“已停止”状态之前,系统调用onSaveInstanceState(Bundle)未“完成”的活动并将其保存在活动Bundle 之外。系统还记得它在活动完成时杀死了活动的进程。使用这两个以及其他设置(保存在活动之外),系统重新创建活动。

但是,如果活动已完成(例如,用户按下后退按钮,从概览窗口中滑开活动的卡片,Activity.finish()被显式调用等),onSaveInstanceState()则不会被调用并且系统不会保存任何设置来重新创建活动它的推出时间。它只是创造了一个新的。

这是个好消息,为什么?因为如果不是这种情况,开发人员将不得不在活动之外手动存储关键状态属性,并在重新启动活动时恢复它们(那将是一场噩梦)

于 2020-07-20T21:05:56.090 回答
0

由于在这个问题上存在很多混淆,很大程度上是由于过去官方文档的混乱状态,以下是文档目前所说的:

系统从不直接杀死活动以释放内存。相反,它会杀死活动运行的进程,不仅会破坏活动,还会破坏进程中运行的所有其他内容。

这以及现实世界的观察得出的答案是否定的。

https://developer.android.com/guide/components/activities/activity-lifecycle#asem

于 2020-07-20T22:36:16.123 回答