Android销毁活动,杀死进程

Posted

技术标签:

【中文标题】Android销毁活动,杀死进程【英文标题】:Android destroying activities, killing processes 【发布时间】:2012-12-31 19:03:00 【问题描述】:

您好,我想知道 android 是如何管理内存的,但我在任何地方都找不到准确的答案。 假设我有一个应用程序,当前活动堆栈上有 5 个活动(4 个停止,1 个恢复),没有连接服务。我按下 HOME 按钮,我的所有活动都停止了。 我启动了其他一些消耗内存的应用程序,并且整体设备内存开始变低。问题是

...我的申请会怎样?

    系统能否只销毁我的一项或多项活动以恢复内存? 系统会杀死我的应用程序的整个过程吗?所有的活动都会被很好地销毁吗? 当我的应用程序完全被杀死后,当我返回应用程序时会发生什么?它会从开始(如第一次开始)开始,还是会尝试将活动恢复到先前的状态/如果是 - 它只是堆栈顶部的一个还是全部?

更新:

在问这个问题之前,我已经看过几次 Activity 生命周期,但它没有回答我的问题。 我做了一些测试,我有一些答案。 DDMS 中的“停止进程”是测试的线索。

我尚未测试问题 1 的答案,但如指南所述:

如果某个活动被暂停或停止,系统可以删除该活动 通过要求它完成或简单地杀死它来从内存中 过程。

似乎可以温和地销毁一个或多个活动(使用 onDestroy 方法)而不杀死进程。回到它们时,您将简单地得到 (onCreate + bundle)。

问题 2 答案:

是的。通常系统会杀死整个过程,这意味着包括活动和静态字段在内的所有数据都被破坏。这做得不好 - 你不会为任何暂停/停止的活动获得 onDestroy 或 finalize() 。这就是为什么在 onPause 方法之前调用 saveInstanceState() 的原因。 onPause 基本上是您应该保存某些内容的最后一种方法,因为在此方法之后您将永远看不到 onStop 或 onDestroy。系统可以杀死销毁所有对象的进程,无论它们持有什么以及它们正在做什么。

问题 3 答案:

当你回到被杀死的应用程序时会发生什么?

在 Android 2.2 之前 - 应用程序将从一开始就启动,并带有启动器活动。 从 2.2 开始 - 系统将恢复以前的应用程序状态。这是什么意思?这意味着将重新创建最后一个可见活动(onCreate + bundle)。活动堆栈会发生什么?堆栈很好,但上面的所有活动都死了。当您使用后退按钮返回时,它们中的每一个都将被重新创建(onCreate + bundle)。 还有一件事:

通常,系统会清除任务(从 堆栈在根活动之上)在某些情况下,当用户 从主屏幕重新选择该任务。通常,如果 用户有一段时间没有访问任务,例如 30 分钟。

结论?

    不要以为处理活动轮换问题就可以解决 通过 android:configChanges="orientation"。当你这样做时,你会 遇到许多您甚至不知道的其他问题。 使用 DDMS 测试您的应用程序 - 停止进程按钮。 See This 使用静态变量时要小心。不要以为当您在活动 1 中初始化它们时 - 您将在活动 2 中初始化它们。初始化全局静态变量的唯一安全位置是 Application 类。 请记住,您可能永远不会看到 onStop 或 onDestroy。关闭文件/数据库,在 onPause 中停止下载器。当您希望应用在 BG 中执行某些操作时 - 使用前台服务。

就是这样......希望我对我的 essey 有帮助 :)

【问题讨论】:

根据您的假设,这 5 个活动是来自同一个应用还是来自几个不同的应用? “我有一个应用程序,当前活动堆栈上有 5 个活动”当然它们都来自我的一个,同一个流程应用程序。 谢谢你,这也是我的问题……你的问题和答案对我帮助很大。 另见:***.com/q/11365301/1402846, ***.com/q/5423571/1402846 @Mark:这个问题现在解决了吗?如果是这样呢? 【参考方案1】:

首先请看一下:

onPause() 当系统即将开始恢复一个 以前的活动。这通常用于提交未保存的更改 持久数据,停止动画和其他可能的东西 消耗CPU等。这种方法的实现必须非常快 因为在此方法之前不会恢复下一个活动 返回。如果活动返回到,则后跟 onResume() 前面,或者 onStop() 如果它对用户不可见。

onStop() 当 Activity 不再对用户可见时调用,因为另一个 Activity 已恢复并覆盖此 一。这可能是因为正在启动新活动, 一个现有的被带到这个前面,或者这个是 被摧毁。如果此活动是,则后跟 onRestart() 返回与用户交互,如果此活动则返回 onDestroy() 即将消失。

因此,当您按下设备上的“HOME”按钮时,您当前的前台活动将放在 onPause() 然后 onStop(),其他 4 应保持 onStop()

根据 Google 的文档:

如果某个 Activity 位于屏幕的前台(位于堆栈顶部),则它处于活动状态或正在运行。 如果 Activity 失去焦点但仍可见(即,新的非全尺寸或透明 Activity 的焦点位于您的 活动),它被暂停。一个暂停的活动是完全活跃的(它 维护所有状态和成员信息,并保持连接到 窗口管理器),但可以在内存极低的情况下被系统杀死 情况。 如果一个活动被另一个活动完全遮挡,它就会停止。它仍然保留所有状态和成员信息,但是, 它不再对用户可见,因此它的窗口被隐藏并且它 当其他地方需要内存时,通常会被系统杀死。 如果一个活动被暂停或停止,系统可以通过要求它完成或简单地从内存中删除该活动 它的过程。当它再次显示给用户时,它必须是 完全重新启动并恢复到以前的状态。

并且,对于流程生命周期:

流程生命周期 3. 后台活动(对用户不可见且已暂停的活动)不再重要,因此 系统可以安全地杀死它的进程来为其他进程回收内存 前景或可见进程。如果它的进程需要被杀死, 当用户导航回活动时(使其在 屏幕),它的 onCreate(Bundle) 方法将被调用 之前提供的 savedInstanceState onSaveInstanceState(Bundle) 以便它可以在同一时间重新启动自己 用户上次离开时​​的状态。

以上所有引用均来自:Android Developers Reference: Activity

确认当您启动一些内存消耗的应用程序时,系统可以销毁非活动活动并回收内存。你可以像这样实现:isFinishing() 在你的活动中,然后使用 DDMS 中的“kill”按钮来检测你的哪些活动被系统丢弃。但我猜系统会先销毁最旧的。但是,当“Launch Activity”被回收时,保留其他活动是没有意义的。

更新

这是我从here找到的一些意见:

停止状态

当一个活动不可见但仍在内存中时,我们说它在 停止状态。可以将停止的活动带回前面以 再次成为跑步活动。或者,它可以被销毁并移除 凭记忆。

系统将活动保持在停止状态,因为它是 用户可能仍希望返回这些活动 很快,重新开始一个停止的活动比 从头开始一项活动。那是因为我们已经拥有了所有 对象加载到内存中,只需将其全部提交到 前景。

可以随时从内存中删除已停止的活动。

【讨论】:

文档在这个问题上相当混乱,但是只能杀死整个进程,而不是单个组件(活动、服务等)。见:***.com/questions/7536988/… 这个问题应该用@greg7gkb评论链接中的信息更新,它具有误导性【参考方案2】:

系统能否仅销毁我的一项或多项活动以恢复 内存?

是的。当需要内存时,Android 会终止在后台运行的活动。杀死一个或全部可能取决于某些条件。对于一个实例暂停或停止可以使android杀死一个活动或一个进程本身。 Here在Activity Lifecycle下你可以获得以下积分。我建议您完全浏览该页面。它一定会清除您的疑虑。

如果一个活动失去焦点但仍然可见(即一个新的 非全尺寸或透明活动的重点是您的 活动),它被暂停。一个暂停的活动是完全活跃的(它 维护所有状态和成员信息,并保持连接到 窗口管理器),但可以在内存极低的情况下被系统杀死 情况。

如果一个活动被另一个活动完全遮挡, 它停止了。它仍然保留所有状态和成员信息, 但是,它不再对用户可见,因此它的窗口被隐藏了 并且经常会在需要内存的时候被系统杀死 其他地方。

如果一个活动被暂停或停止,系统可以丢弃 通过要求它完成或简单地从记忆中的活动 杀死它的进程。当它再次显示给用户时,它必须 完全重新启动并恢复到之前的状态。


系统会杀死我的应用程序的整个过程吗?都会 活动被很好地销毁?

活动与个人有关,而过程与活动组有关。再次查看上面的第三点,它会杀死前面提到的进程。


当我完全恢复我的应用程序时会发生什么 杀了?

类似于重启。同样,第三点会给你一些答案,比如When it is displayed again to the user, it must be completely restarted and restored to its previous state

获取更多关于内存相关内容的信息here。

编辑: 应用程序中的所有活动都在单个进程中运行。因此,当一个进程被杀死时,所有活动,无论是 5 还是 10 都将被杀死,即重新启动。重新启动将导致您的应用程序从没有保存状态的开头开始。

【讨论】:

我已经看过 Activity Lifecycle 至少 5 次,但它没有回答我的问题。你所说的意思是当我的应用程序进程被杀死时 - 当我回到应用程序时,它会恢复到以前的状态。因此,当我有 5 个停止的活动时......当进程被杀死时,它们是否都死了(调用了 onDestroy)?当我回到我的应用程序时,所有活动都恢复了(onCreate + bundle)还是只有堆栈顶部的一个(用户可见)? 应用程序中的所有活动都在单个进程中运行。因此,当一个进程被杀死时,所有活动,无论是 5 还是 10 都将被杀死,即重新启动。重新启动将导致您的应用程序从头开始,没有保存状态.. 几乎正确,但不适用于 2.2 及更高版本。在页面顶部查看我的更新。 不,这不是真的,而且从来都不是真的。根据文档令人困惑,但请参阅:***.com/questions/7536988/… @JJPA Android 无法销毁单个活动来回收内存,它只会销毁进程。请参阅参与“内存不足杀手”实施的 Android 核心团队成员 Dianne Hackbor 的回答:***.com/a/7576275/1290264。

以上是关于Android销毁活动,杀死进程的主要内容,如果未能解决你的问题,请参考以下文章

当活动崩溃时,进程保持活动状态,我无法杀死它

Android可以彻底杀死一个进程吗

Android可以彻底杀死一个进程吗

活动垃圾收集

如何在父进程被杀死/完成时保持子进程处于活动状态(在 Windows 中)

当应用程序进程被终止时,请勿打开上一个活动