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