嗨,我想知道Android是如何管理内存的,但我找不到确切的答案。假设我有一个应用程序,在当前活动堆栈中有5个活动(4个已停止,1个正在运行),没有连接任何服务。我按Home键,使所有活动停止。我启动一些占用内存的应用程序,设备总内存开始变低。问题是:
...我的应用程序会发生什么?
- 系统是否只会销毁其中一个或一些活动以回收内存?
- 系统是否会杀死整个应用程序进程?所有活动是否都将被完全销毁?
- 当我回到我的应用程序时,如果它被完全杀死,会发生什么?它会从头开始(像第一次启动)还是会尝试恢复先前的状态/如果是-只有在堆栈顶部的那一个还是全部?
更新:
在提出这个问题之前,我多次看过Activity生命周期,但它没有解答我的问题。我进行了一些测试,有了一些答案。 DDMS中的“停止进程”是测试的线索。
我没有测试问题1的答案,但随着指南的说法:
如果活动暂停或停止,则系统可以通过要求它完成或简单地终止其进程来从内存中删除该活动。
似乎可以温柔地销毁一个或多个活动(使用onDestroy方法),而不会杀死进程。当再次返回到它们时,您将只会得到(onCreate + bundle)。
问题2的答案:
是的。通常,系统会杀死整个进程,这意味着所有数据,包括活动和静态字段,都将被销毁。这不是很好-您不会收到任何已暂停/停止活动的onDestroy或finialize()信息。这就是为什么saveInstanceState()在onPause方法之前调用的原因。onPause基本上是您应该保存某些内容的最后一种方法,因为在此方法之后,您可能永远无法看到onStop或onDestroy。系统可以只是杀死进程,破坏所有东西并清除所有正在进行的操作。
第三个问题的答案:
当重新进入一个已经被杀死的应用程序时会发生什么?
- 在Android 2.2之前 - 应用程序将从头开始,回到启动器活动。
- 从2.2开始 - 系统将恢复先前的应用程序状态。这是什么意思?这意味着最后可见的活动将被重建(onCreate + bundle)。活动栈会怎样呢?堆栈没有问题,但是其中所有的活动都已死亡。当您按下返回按钮重新回到它时,每个活动都将被重建(onCreate + bundle)。 关于这件事还有一件事情:
通常,在用户从主屏幕重新选择该任务时,系统会在某些情况下清除任务(从根活动以上的堆栈中删除所有活动)。如果用户在一定时间内(如30分钟)没有访问该任务,则通常会执行此操作。
结论?
- 不要认为可以通过android:configChanges="orientation"来解决处理活动旋转问题。这样做会引发您甚至没有意识到的许多其他问题。
- 使用DDMS测试您的应用程序 - 停止进程按钮。 请参考此链接
- 使用静态变量时要小心。不要认为在活动1中初始化它们后,您将在活动2中初始化它们。初始化全局静态变量的唯一安全位置是应用程序类。
- 记住您可能永远看不到onStop或onDestroy。在onPause中关闭文件/数据库,停止下载器。当您想要应用程序在BG中执行某些操作时 - 使用前台服务。
就这样了...希望我的论文能对您有所帮助 :)