【发布时间】:2012-12-31 19:03:00
【问题描述】:
您好,我想知道 Android 是如何管理内存的,但我在任何地方都找不到准确的答案。 假设我有一个应用程序,当前活动堆栈上有 5 个活动(4 个停止,1 个恢复),没有连接服务。我按下 HOME 按钮,我的所有活动都停止了。 我启动了其他一些消耗内存的应用程序,并且整体设备内存开始变低。问题是
...我的申请会怎样?
- 系统能否只销毁我的一项或多项活动以恢复内存?
- 系统会杀死我的应用程序的整个过程吗?所有的活动都会被很好地销毁吗?
- 当我的应用程序完全被杀死后,当我返回应用程序时会发生什么?它会从开始(如第一次开始)开始,还是会尝试将活动恢复到先前的状态/如果是 - 它只是堆栈顶部的一个还是全部?
更新:
在问这个问题之前,我已经看过几次 Activity 生命周期,但它没有回答我的问题。 我做了一些测试,我有一些答案。 DDMS 中的“停止进程”是测试的线索。
我尚未测试问题 1 的答案,但如指南所述:
如果某个活动被暂停或停止,系统可以删除该活动 通过要求它完成或简单地杀死它来从内存中 过程。
似乎可以温和地销毁一个或多个活动(使用 onDestroy 方法)而不杀死进程。回到它们时,您将简单地得到 (onCreate + bundle)。
问题 2 答案:
是的。通常系统会杀死整个过程,这意味着包括活动和静态字段在内的所有数据都被破坏。这做得不好 - 你不会为任何暂停/停止的活动获得 onDestroy 或 finalize() 。这就是为什么在 onPause 方法之前调用 saveInstanceState() 的原因。 onPause 基本上是您应该保存某些内容的最后一种方法,因为在此方法之后您将永远看不到 onStop 或 onDestroy。系统可以杀死销毁所有对象的进程,无论它们持有什么以及它们正在做什么。
问题 3 答案:
当你回到被杀死的应用程序时会发生什么?
- 在 Android 2.2 之前 - 应用程序将从一开始就启动,并带有启动器活动。
- 从 2.2 开始 - 系统将恢复以前的应用程序状态。这是什么意思?这意味着将重新创建最后一个可见活动(onCreate + bundle)。活动堆栈会发生什么?堆栈很好,但上面的所有活动都死了。当您使用后退按钮返回时,它们中的每一个都将被重新创建(onCreate + bundle)。 还有一件事:
通常,系统会清除任务(从 堆栈在根活动之上)在某些情况下,当用户 从主屏幕重新选择该任务。通常,如果 用户有一段时间没有访问任务,例如 30 分钟。
结论?
- 不要以为处理活动轮换问题就可以解决 通过 android:configChanges="orientation"。当你这样做时,你会 遇到许多您甚至不知道的其他问题。
- 使用 DDMS 测试您的应用程序 - 停止进程按钮。 See This
- 使用静态变量时要小心。不要以为当您在活动 1 中初始化它们时 - 您将在活动 2 中初始化它们。初始化全局静态变量的唯一安全位置是 Application 类。
- 请记住,您可能永远不会看到 onStop 或 onDestroy。关闭文件/数据库,在 onPause 中停止下载器。当您希望应用在 BG 中执行某些操作时 - 使用前台服务。
就是这样......希望我对我的 essey 有帮助 :)
【问题讨论】:
-
根据您的假设,这 5 个活动是来自同一个应用还是来自几个不同的应用?
-
“我有一个应用程序,当前活动堆栈上有 5 个活动”当然它们都来自我的一个,同一个流程应用程序。
-
谢谢你,这也是我的问题……你的问题和答案对我帮助很大。
-
@Mark:这个问题现在解决了吗?如果是这样呢?