Android销毁活动,查杀进程
您好我想知道Android如何管理内存,我无法找到任何准确的答案。 假设我有一个在当前活动堆栈上有5个活动的应用程序(4个停止,1个恢复),没有连接服务。 我按HOME按钮,以便我的所有活动都停止。 我启动了一些其他耗费内存的应用程序,整体设备内存开始不足。 问题是
...我的申请会发生什么?
更新:
在问这个问题之前,我已经看过几次Activity生命周期,但它没有解答我的问题。 我做了一些测试,我有一些答案。 DDMS中的“停止过程”是测试的一个线索。
我没有测试过问题1的答案,但正如指南所说:
如果活动暂停或停止,则系统可以通过要求完成或仅干脆停止活动,从而从内存中删除活动。
看起来,一个或多个活动可以轻松销毁(使用onDestroy方法)而不会终止进程。 当你回到他们的时候,你会得到(onCreate + bundle)。
问题2答案:
是。 通常系统会杀死整个过程,这意味着包括活动和静态字段在内的所有数据都会被销毁。 这不是很好 - 你不会为任何暂停/停止的活动获取onDestroy或finialize()。 这就是为什么在onPause方法之前调用saveInstanceState()的原因。 onPause基本上是您应该保存某些内容的最后一种方法,因为在此方法之后,您永远无法看到onStop或onDestroy。 系统可以杀死所有对象的进程,无论他们持有什么以及他们在做什么。
问题3答案:
当你回到杀死的应用程序时会发生什么?
通常,当用户从主屏幕重新选择该任务时,系统会在某些情况下清除任务(从根目录活动之上的堆栈中移除所有活动)。 通常,如果用户在一定时间内未访问任务,例如30分钟,则完成此操作。
结论?
那就是它......希望我帮助我的essey :)
首先请看看这个:
onPause()当系统即将开始恢复先前的活动时调用。 这通常用于将未保存的更改提交给持久性数据,停止动画和其他可能消耗CPU的内容等。此方法的实现必须非常快速,因为在此方法返回之前,下一个活动不会恢复。 如果活动返回到前面,则跟随onResume();如果对用户不可见,则使用onStop()。
onStop()当活动对用户不再可见时调用,因为另一个活动已恢复并正在覆盖此活动。 这可能是因为一项新的活动正在开始,现有的活动正在这个活动之前,或者这个活动正在被摧毁。 紧随其后的是onRestart(),如果此活动返回与用户交互,或者onDestroy()(如果此活动消失)。
所以,当你按下设备上的“HOME”按钮时,你当前的前景活动将被放到onPause()
然后onStop()
,另外4个应该保持onStop()
根据谷歌的文件:
而且,对于流程生命周期:
流程生命周期 3.后台活动(对用户不可见并且已暂停的活动)不再重要,因此系统可以安全地终止其进程以回收其他前台或可见进程的内存。 如果它的进程需要被终止,当用户导航回活动(再次使其在屏幕上可见)时,它的onCreate(Bundle)方法将使用之前在onSaveInstanceState(Bundle)中提供的savedInstanceState调用,以便它可以在用户最后离开它的状态下重新启动。
以上所有引用来自:Android开发人员参考:活动
经证实,当您启动一些耗费内存的应用程序时,系统可以销毁不活跃的活动并回收回忆。 您可以在您的活动中实现如下方法: isFinishing()
,然后使用DDMS中的“kill”按钮来检测系统正在删除哪些活动。 但我想系统会首先摧毁最老的一个。 然而,当“发布活动”已被回收时,保留其他活动是没有意义的。
UPDATE
以下是我在这里找到的一些意见:
停止状态
当一个活动不可见,但仍在记忆中时,我们说它处于停止状态。 停止的活动可以被带回到前面再次成为跑步活动。 或者,它可能会被销毁并从内存中移除。
系统将活动保持在停止状态,因为很可能用户仍然希望很快回到那些活动,并且重新启动停止的活动比从头开始活动要便宜得多。 这是因为我们已经将所有对象加载到内存中,并且必须将它们全部放到前台。
任何时候停止的活动都可以从内存中移除。
系统能否销毁我的一项或部分活动来恢复内存?
是。 当需要内存时,Android会杀死在后台运行的活动。 杀死一个或全部可能取决于某些条件。 对于暂停或停止的实例可以使android杀死一个活动或一个进程本身。 在活动生命周期中,您可以获得以下几点。 我建议您完整浏览该页面。 它一定会清除你的疑惑。
如果某项活动失去了重点但仍然可见(即,新的非全尺寸或透明活动将重点放在活动顶部),该活动已暂停。 暂停的活动是完全活动的(它保留所有状态和成员信息并保持连接到窗口管理器),但可以在极低内存情况下被系统杀死。
如果一项活动被另一项活动完全遮蔽,则会停止。 它仍然保留所有状态和成员信息,但是,用户不再可见,因此其窗口处于隐藏状态,并且在别处需要内存时通常会被系统杀死。
如果活动暂停或停止,则系统可以通过要求完成或仅干脆停止活动,从而从内存中删除活动。 当它再次显示给用户时,它必须完全重新启动并恢复到以前的状态。
系统会杀死我的应用程序的整个过程吗? 所有的活动都会被很好地摧毁吗?
活动属于个人,而过程属于一组活动。 再看看上面的第三点,它杀死了上述过程。
当它完全被杀时,当我回到我的应用程序时会发生什么?
它类似于重启。 再次,第三点会给你一些答案,例如When it is displayed again to the user, it must be completely restarted and restored to its previous state
在这里获取更多关于内存相关内容的信息。
编辑:
应用程序中的所有活动都在一个进程中运行。 所以当一个进程被杀时,所有的活动无论是5还是10都会被杀死,即重新启动。 重新启动将导致您的应用程序从一开始就没有保存的状态。