Android破坏活动,查杀进程

时间:2013-01-17 09:21:50

标签: android android-activity

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

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

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

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

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

      

    如果活动暂停或停止,系统可以放弃活动   从记忆中要么完成要么完全杀死它   过程

    似乎可以轻轻地销毁一个或多个活动(使用onDestroy方法)而不会终止进程。回到它们之后,你会得到(onCreate + bundle)。

    问题2回答:

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

    问题3回答:

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

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

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

    结论吗

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

2 个答案:

答案 0 :(得分:30)

首先请看一下:

img1

  

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

     

onStop()当用户不再看到该活动时调用,因为另一个活动已恢复并且正在覆盖此   一。这可能是因为正在开始新活动,   现有的一个被带到这个之前,或者这个是   被摧毁。如果此活动是,则跟随onRestart()   回来与用户交互,或者如果此活动是onDestroy()   正在消失。

因此,当您按设备上的“主页”按钮时,您当前的前景活动会被置于onPause()然后onStop(),其他4应保留onStop()

根据谷歌的文件:

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

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

  

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

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

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

<强>更新

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

  

停止状态

     

当一项活动不可见但仍在记忆中时,我们会说它在一个   停止状态。停止活动可以带回到前面   再次成为一个跑步活动。或者,它可以被销毁和删除   来自记忆。

     

系统将活动保持在停止状态,因为它是   可能用户仍然希望回到这些活动   一段时间后,重新启动已停止的活动远比便宜   从头开始活动。那是因为我们已经拥有了所有   在内存中加载的对象只需要将它全部带到内存中   前景。

     

任何时候都可以从内存中删除已停止的活动。

答案 1 :(得分:1)

  

系统是否只能破坏我的一项或部分活动才能恢复   存储器?

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

  

如果活动失去焦点但仍然可见(即新的活动   非全尺寸或透明的活动专注于您的   活动),它被暂停了。暂停的活动完全存在(它   维护所有州和会员信息并保持附加   窗口管理器),但可以在极低内存中被系统杀死   的情况。

     

如果某项活动被其他活动完全遮挡,   它被停止了。它仍保留所有州和会员信息,   但是,它不再对用户可见,因此其窗口被隐藏   当需要内存时,它通常会被系统杀死   别处。

     

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


  

系统是否会终止我的应用程序的整个过程?将全部   活动被很好地摧毁了?

活动属于个人,而过程属于活动组。再看上面的第三点,它就像前面提到的那样杀死了这个过程。


  

当我完全回到我的应用程序时会发生什么   杀?

它类似于重启。第三点再次给出一些答案,如When it is displayed again to the user, it must be completely restarted and restored to its previous state

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

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