Android 系统如何终止活动的概述

Android 系统如何终止活动的概述,android,runtime,kill,activity-lifecycle,Android,Runtime,Kill,Activity Lifecycle,有人能简要介绍一下运行时终止活动的时间和方式吗?我想知道暂停和停止状态之间的区别。什么会迫使系统销毁暂停的活动,与停止的原因完全相同(内存不足) 我认为,如果某个活动因来电而暂停(这会突然导致内存不足),系统只会倾向于释放已停止活动的资源。但这是怎么做到的呢?系统什么时候通过调用finish()来“善意地询问”活动,什么时候没有,什么时候onDestroy()仍然被调用?文档中对您询问的大部分内容都做了很好的描述,但我想我可以澄清一些事情 我想知道两者的区别 处于暂停和停止状态之间 能见度。这两

有人能简要介绍一下运行时终止活动的时间和方式吗?我想知道暂停和停止状态之间的区别。什么会迫使系统销毁暂停的活动,与停止的原因完全相同(内存不足)


我认为,如果某个活动因来电而暂停(这会突然导致内存不足),系统只会倾向于释放已停止活动的资源。但这是怎么做到的呢?系统什么时候通过调用finish()来“善意地询问”活动,什么时候没有,什么时候onDestroy()仍然被调用?

文档中对您询问的大部分内容都做了很好的描述,但我想我可以澄清一些事情

我想知道两者的区别 处于暂停和停止状态之间

能见度。这两种状态是不同的,因为暂停的活动可能只被另一个活动部分遮挡,例如应用了
对话框
主题的活动。这就需要保留保持可视状态所需的任何资源。停止的活动可以丢弃那些资源,如果资源紧张,这些资源可能会导致活动被销毁或保留

我想。。。系统只是更倾向于 释放停止的资源 活动。但这是怎么做到的呢

这是必须的。停止的活动是完全看不见的,这使得它们比那些仍在为用户所看到的东西做出贡献的活动更容易被杀死。我从未见过安卓将一个暂停但部分可见的活动从一个已恢复的活动中拉出,但我认为它可能在正确的情况下发生。系统知道每个活动的状态,因为它是引导它们的

系统何时“善意地询问”用户 通过调用finish()和when 不是,onDestroy()什么时候仍然存在 接到电话了吗

系统将在可能的情况下进行有序销毁,但API只能保证活动将看到
onPause()
onSaveInstanceState()


ETA:从堆栈中删除活动的确切原因在源代码中。你不应该将这些理由视为普遍真理,因为Android的未来版本可能会做出不同的决定。

我明白了,这是本课程的标准!我看到一些有价值的信息,夹杂着昂贵的错误信息。不,在线文档并没有详细说明在什么情况下终止进程。这是故意的,因为它可能会在未经通知的情况下更改。当然,调用onDestroy()最常见的原因是系统内存不足,这在较新的手机上不太常见(因为它们的内存太多)。但不能保证这是它被命名的唯一原因

但是是的,Android和开发者之间的“契约”是,如果你遵循规则,在需要时实现所需的生命周期回调,那么它就会工作,你不需要确切知道在什么情况下调用onStop()、onSaveInstanceState()和onDestroy()

与谷歌不同的是,我承认合同的措辞在某些方面有些模糊。这是因为,除其他次要原因外,他们使用具有标准行业含义的术语,如“前景”,但他们使用的含义略有改变。这种变化要么从未解释过,要么只是在模糊的地方解释过。该图旨在显示“活动在状态之间可能采取的路径”,但却没有显示onDestroy()可以多次调用,甚至没有绕过从恢复到停止的转换,这也无济于事。然而,文本清楚地描述了这种可能性

不幸的是,这就是为什么仅仅阅读“应用程序基础知识”的应用程序生命周期部分是不够的。相反,还必须阅读活动调用下每个回调的Javadoc,以及关于流程的“应用程序基础”部分


在这之后,将Log.d语句放在每个回调中,并在应用程序的整个生命周期中循环时观察logcat输出,这将非常有帮助。但即使如此,也不要依赖于生命周期事件按照您在logcat中看到的顺序发生,除非您可以在上面提到的其中一个在线文档中找到它的理由。

谢谢,这有助于澄清它。因此,当onDestroy()甚至onStop()未被调用时,可能会出现一些罕见的情况。在“应用程序基础知识”一节中,有一个关于活动生命周期的详细描述,可以回答您的大多数问题。不,它没有回答上述问题。如果您对此有疑问,请看一看。@cody:如果您确实花了一些时间阅读Josef链接的文档,您应该对Android应用程序生命周期的工作方式有必要的了解,这也应该回答您的问题。如果还有一些不清楚的地方,我建议你问一个具体的问题。如果你确定的话,为什么不把答案放在这里呢?我问了一个特别的问题,如果你再看我的帖子,你可能会得到这个问题。当然,我已经看过指南了(不止一次),也许我应该明确提到这一点。此外,我注意到这里的一些海报并不是真的想帮上忙,他们只是想获得声誉。对不起,对于一个知道答案的人来说,这需要很多词吗?可能只是一句话,或者你怎么想?我加了一个空行。换句话说,我想知道从活动堆栈中完全删除活动的确切原因,以及是否调用onDestroy。