当应用程序处于后台时,Android是否可以在不终止整个过程的情况下终止活动?

当应用程序处于后台时,Android是否可以在不终止整个过程的情况下终止活动?,android,android-activity,android-lifecycle,android-memory,android-ondestroy,Android,Android Activity,Android Lifecycle,Android Memory,Android Ondestroy,我想知道Android系统是否能够在应用程序最小化的情况下,在没有整个应用程序过程的情况下终止活动。从Android文档中我们知道,onDestroy仅在活动即将销毁时调用,并且系统保证在活动即将终止时调用此方法,而不会仅在整个应用程序进程终止时调用 因此,想象一下这样的情况-你将应用程序发送到后台(最小化),一段时间后,操作系统开始运行内存不足,并决定终止活动,但由于该应用程序当前处于挂起状态,无法执行代码,因此无法调用其onDestroy方法,尽管保证在每次活动销毁之前都会调用该方法 因此,

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

因此,想象一下这样的情况-你将应用程序发送到后台(最小化),一段时间后,操作系统开始运行内存不足,并决定终止活动,但由于该应用程序当前处于挂起状态,无法执行代码,因此无法调用其
onDestroy
方法,尽管保证在每次活动销毁之前都会调用该方法


因此,这种推理让我想到,当应用程序处于后台时,操作系统只能终止整个过程,而不能终止某些特定的活动。我的推理是正确的,还是遗漏了什么?

没错:当应用程序处于后台时,操作系统只能终止整个过程,而不能终止某些特定活动。

你的推理是正确的

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

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

如果活动的进程被终止,系统会在活动外部临时保存一组设置,并使用这些设置在下次启动活动时重新创建活动

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

但是,如果活动已完成(例如,用户按下“上一步”按钮,从概览窗口刷走活动卡,
activity.finish()
被显式调用,等等),则不会调用
onSaveInstanceState()
,并且系统不会保存任何设置以在下次启动活动时重新创建活动。它只是创造了一个新的


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

因为在这个问题上存在很多混乱,很大程度上是由于过去官方文档的混乱状态,医生是这么说的 目前:

系统从不直接终止活动以释放内存。 相反,它会终止活动运行的进程,破坏 不仅是活动,还包括流程中运行的所有其他内容,如 嗯

这一点以及现实世界的观察结果表明答案是否定的


这是个好问题。它当然可以做到这一点——例如,查看“不保留活动”开发人员选项。但是,当这个选项没有启用时,我不知道它通常会做什么。这是正确的答案,Android不会只杀死特定的组件,它会杀死整个过程。如果你挖得够深,这里有一句来自谷歌工程师的话。@SteveM,MarianPaździoch谢谢你的回复。因此,基本上是最后一次确认——当应用程序处于前台时,操作系统可以破坏某些特定活动或终止整个过程(应用程序处于活动状态时不应该经常发生)为了释放一些资源,当应用程序挂起时,它只能终止整个进程?@starwarrior8809据我所知,它只是作为一种内存管理技术终止了整个进程。在dev选项中选择“Don't Keep Activities”会在用户离开时立即将其销毁,但这实际上只是一个调试工具。我同意Steve的观点@starwarrior8809-你问了“应用程序在后台时”,所以我回答了关于后台的问题。现在,您也从相同的文档询问前台:但是,如果系统由于系统约束(如配置更改或内存压力)而销毁活动,那么尽管实际的活动实例已不存在,但系统仍会记住它存在。如果用户试图导航回该活动,系统将使用一组保存的数据创建该活动的新实例,这些数据描述了活动被销毁时的状态。@超对称性但关键问题是-当应用程序处于后台时,系统是否能够销毁该活动。如果应用程序是后台的,它将被挂起并且不执行任何代码,因此系统无法终止某些特定的活动,因为它无法调用其
onDestroy
回调,尽管保证在每次活动销毁之前都会调用它。这种推理意味着系统只能在应用程序挂起时销毁整个应用程序进程。再一次,很抱歉问了很多问题-我是从iOS世界来到这里的,那里有很多东西simpler@SuperSymmetry要么是我误解了你的回答,要么是你误解了我的问题)如果整个应用程序被最小化和暂停(t