Android销毁活动,查杀进程

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

...我的申请会发生什么?

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

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

    我没有测试过问题1的答案,但正如指南所说:

    如果活动暂停或停止,则系统可以通过要求完成或仅干脆停止活动,从而从内存中删除活动。

    看起来,一个或多个活动可以轻松销毁(使用onDestroy方法)而不会终止进程。 当你回到他们的时候,你会得到(onCreate + bundle)。

    问题2答案:

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

    问题3答案:

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

  • 在Android 2.2之前 - 应用程序将从启动开始,并启动启动器。
  • 从2.2开始 - 系统将恢复以前的应用程序状态。 这是什么意思? 这意味着最后可见的活动将被重新创建(onCreate + bundle)。 活动堆栈会发生什么? 堆叠很好,但其上的所有活动都已死亡。 当您通过后退按钮返回时,它们中的每一个都将被重新创建(onCreate + bundle)。 还有一件事是这样的:
  • 通常,当用户从主屏幕重新选择该任务时,系统会在某些情况下清除任务(从根目录活动之上的堆栈中移除所有活动)。 通常,如果用户在一定时间内未访问任务,例如30分钟,则完成此操作。

    结论?

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


    首先请看看这个:

    IMG1

    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都会被杀死,即重新启动。 重新启动将导致您的应用程序从一开始就没有保存的状态。

    链接地址: http://www.djcxy.com/p/90799.html

    上一篇: Android destroying activities, killing processes

    下一篇: launchModes, singleTask: how to switch between "screens"? Is Intents the only way, and if so I think I have a problem