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