嗨,我想知道 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 分钟)没有访问任务,则会执行此操作。
结论?
- 不要以为处理activity轮换问题可以通过android:configChanges="orientation"来解决。当你这样做时,你会遇到许多其他你甚至没有意识到的问题。
- 使用 DDMS 测试您的应用程序 - 停止进程按钮。看到这个
- 使用静态变量时要小心。不要以为当您在活动 1 中初始化它们时 - 您将在活动 2 中初始化它们。初始化全局静态的唯一安全位置是 Application 类。
- 请记住,您可能永远不会看到 onStop 或 onDestroy。关闭文件/数据库,在 onPause 中停止下载器。当您希望应用程序在 BG 中执行某些操作时 - 使用前台服务。
就是这样......希望我帮助我的essey :)