Android可以在不杀死应用程序的情况下“杀死”一个活动吗?

Posted

技术标签:

【中文标题】Android可以在不杀死应用程序的情况下“杀死”一个活动吗?【英文标题】:Can Android 'kill' an Activity without killing the application? 【发布时间】:2013-08-05 21:50:15 【问题描述】:

我们知道,android 中针对此类场景的默认流程是在释放对 Activity 对象的引用之前调用 Activity 各自的 onSaveInstanceStateonStoponDestroy 方法。

但是,当我的应用程序在后台时,似乎我有一个案例,活动在没有调用这些方法的情况下被杀死,但我的应用程序本身并没有被破坏。

但是我无法强制重现此内容。每当我在前台使用需要大量资源的应用程序时,整个进程都会被杀死,而不仅仅是活动。

哪一种让我想知道,因为我认为在低资源上的“应用杀戮”本质上只是旧的信号方式,Android系统是否真的在不调用这些方法的情况下立即“杀死”(释放)一个活动?还是我在追鬼?

【问题讨论】:

这是千分之一的场景,还是经常发生? 您能为此提供任何证据吗?我不确定你所说的“被杀”是什么意思。我不相信 Android 会在没有首先调用其onDestroy 方法的情况下为 GC 发布 Activity。正如您所注意到的,它可以终止包含 Activity 的进程,这将产生终止 Activity 的影响,wo/callback。还有 Doze,它可能会使 Activity 处于静止状态。 【参考方案1】:

Android app out of memory issues - tried everything and still at a loss

事情不是这样运作的。唯一影响活动生命周期的内存管理是跨所有进程的全局内存,因为 Android 认为它的内存不足,因此需要终止后台进程以获取一些内存

现在official documents里的解释更清楚了

系统从不直接杀死活动以释放内存。相反,它会杀死活动运行的进程,不仅会破坏活动,还会破坏进程中运行的所有其他内容。要了解如何在系统启动的进程死亡发生时保留和恢复 Activity 的 UI 状态,请参阅保存和恢复 Activity 状态。

【讨论】:

【参考方案2】:

即使您的应用在前台,Android 操作系统也可能只杀死您的部分活动。例如,如果您有两个活动AB,当A 调用startActivity / startActivityForResult 以启动活动B 时,Android 可能会决定销毁活动A 的实例,因为它占用了太多内存空间。

您可以通过在developer options menu 中检查Don't keep activities 来强制杀死不在前台运行的活动。

【讨论】:

【参考方案3】:

Android 系统是否真的“杀死”(释放)一个活动 立即不调用这些方法?

是的。以下是文档关于onStop() 的内容:

请注意,在内存不足的情况下,可能永远不会调用此方法 系统没有足够的内存来保存您的活动 在调用其 onPause() 方法后运行的进程。

关于onDestroy()

在某些情况下,系统会简单地终止活动的托管 处理而不在其中调用此方法(或任何其他方法),因此它 不应该被用来做打算留在身边的事情 进程消失后。

不要指望这个方法被调用作为一个地方 保存数据!例如,如果活动正在编辑内容中的数据 提供者,这些编辑应该在 onPause() 或 onSaveInstanceState(Bundle),这里没有。

“但是我无法强制重现这种情况。” - 您可以通过在后台发送应用程序然后使用 DDMS 手动终止进程来重现这种情况。

【讨论】:

我想“杀死”(释放)活动而不杀死应用程序。我在问Android系统是否会在不调用这些方法并且不终止应用程序的情况下终止活动? 对不起,我误会了。我不能肯定地说,但是在阅读我到处看到的文档时,我都在谈论杀死应用程序进程,而不是特定的活动。所以我猜如果你的一个活动执行一些“繁重”的任务并被发送到后台,那么 Android 操作系统将杀死整个应用程序。 我在测试中也遇到了相同的行为 - 调用 onStop() 和 onDestroy() 并且活动被破坏或应用程序被杀死。但我在文档中找不到明确的答案。

以上是关于Android可以在不杀死应用程序的情况下“杀死”一个活动吗?的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序处于状态后台或被杀死时,如何在不点击通知的情况下存储 iOS 远程通知?

如何在不杀死未完成的芹菜任务的情况下重新启动heroku应用程序

如何在不杀死 /health 的情况下将我的 Spring Boot 应用程序默认为 application/xml?

在不通过通用测试的情况下杀死 gen_server

如何在不“杀死” Unity 的情况下在 Ubuntu 14.04 中安装 Matlab MCR?

android 怎么永久杀死进程