Android破坏活动,查杀进程

Mar*_*ark 116 android android-activity

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

......我的申请会怎样?

  1. 系统可以只销毁我的一个或一些活动来恢复内存吗?
  2. 系统会杀死我申请的整个过程吗?所有的活动都会被很好地摧毁吗?
  3. 当我完全杀死我的应用程序时会发生什么?它会从开始(如第一次开始)开始,还是会尝试将活动恢复到正常状态/如果是 - 它只是堆栈顶部的那个还是全部?

更新:

在提出这个问题之前,我已经看过几次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分钟),则完成此操作.

结论?

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

那将是它...希望我帮助我的essey :)

dum*_*ers 30

首先请看一下:

IMG1

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

onStop()当活动不再对用户可见时调用,因为另一个活动已恢复并且正在覆盖此活动.这可能是因为正在开始新活动,现有活动被带到这个活动之前,或者这个活动正在被销毁.如果此活动返回与用户交互,则执行onRestart(),如果此活动消失,则执行onDestroy().

所以,当您按下设备上的"HOME"键,您当前的前景活动放到onPause()随后onStop(),其他4仍应onStop()

根据谷歌的文件:

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

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

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

以上所有引用均来自:Android开发者参考:活动

经证实,当您启动一些内存消耗应用程序时,系统可以破坏非活动活动并回收内存.您可以isFinishing()在您的活动中实现:然后在DDMS中使用"kill"按钮来检测系统正在删除哪些活动.但我想系统会先破坏最老的系统.但是,当"启动活动"被回收时,保留其他活动是没有意义的.

UPDATE

以下是我从这里发现的一些意见:

停止状态

当活动不可见但仍在内存中时,我们说它处于停止状态.停止活动可以重新回到前面,再次成为Running活动.或者,它可以被破坏并从内存中删除.

系统将活动保持在停止状态,因为用户可能仍希望很快回到那些活动,并且重新启动已停止的活动比从头开始活动便宜得多.那是因为我们已经将所有对象加载到内存中,只需要将它们全部放到前台.

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

  • 文档在这个问题上非常混乱,但是只能杀死整个过程,而不是单个组件(活动,服务等).请参阅:http://stackoverflow.com/questions/7536988/android-app-out-of-memory-issues-tried-everything-and-still-at-a-loss/7576275#7576275 (4认同)