活动生命周期中的android内存管理
我的问题有点复杂 我想了解当活动开始,然后暂停时,应用程序如何处理资源(特别是背景图像、按钮等) 例如,我启动活动A,它在屏幕上显示所有图像,占用内存,然后启动另一个活动B,暂停A。所有图像、资源等会发生什么变化。?他们什么时候获释?我怎样才能控制他们?我是否应该将活动A保留在内存中并将其从活动堆栈中删除 如果您需要我的问题的任何澄清,请写信给我 提前谢谢!活动生命周期中的android内存管理,android,memory,android-activity,Android,Memory,Android Activity,我的问题有点复杂 我想了解当活动开始,然后暂停时,应用程序如何处理资源(特别是背景图像、按钮等) 例如,我启动活动A,它在屏幕上显示所有图像,占用内存,然后启动另一个活动B,暂停A。所有图像、资源等会发生什么变化。?他们什么时候获释?我怎样才能控制他们?我是否应该将活动A保留在内存中并将其从活动堆栈中删除 如果您需要我的问题的任何澄清,请写信给我 提前谢谢! Danail在编写Java代码时,对内存的控制非常有限。对于大多数情况来说,这是一件好事。实际上,大多数应用程序不需要担心内存问题 为了回
Danail在编写Java代码时,对内存的控制非常有限。对于大多数情况来说,这是一件好事。实际上,大多数应用程序不需要担心内存问题
为了回答您的问题,活动A的所有对象在挂起时仍将在内存中。VM将在需要资源时启动GC 在回答你的问题之前,我有一些事实要讨论
finish()
,则调用onStop()
,最后调用onDestroy()
,它将该活动用于垃圾收集并从Android的活动堆栈中移除onCreate()
上的可绘制缓存onCreate
上禁用可绘制缓存,如下所示:
LinearLayout v = (LinearLayout) findViewById(R.id.mainLayout);
v.setDrawingCacheEnabled(false);
并调用
finish()在onPause()上的code> 活动在完成之前不会释放资源。但在大多数情况下,这对你来说一定不是问题。在我看来,在大多数情况下,您不应该添加自己的资源管理并使代码复杂化
但如果你真的认为你的应用程序可能内存不足,你应该用类似的方法检查一下。内存问题可能是由内存泄漏引起的,而不是内存占用过多
最后,当您完全确定必须采取措施减少内存使用时,您可以进行一些内存优化。例如,您可以将占用内存的对象(例如大型图像)保存到onStop()
中的本地存储中,并将其加载到onStart()
中。我认为为此使用onPause()
/onResume()
是个坏主意,因为活动部分甚至完全可见
理论上,你甚至可以在onStop()
中销毁所有小部件,并在onStart()
中恢复它们,但这可能会使你的应用程序运行太慢。当然,在这种情况下,状态保存必须由您实现
完成活动似乎是个好主意,但我认为不是。首先,它会让你的工作变慢。其次,您必须自己管理活动堆栈和活动状态。
例如,活动A启动活动B。所以,活动B必须知道当用户按下后退按钮时该做什么。当用户按下后退按钮时,您应该启动活动A并恢复其状态。但若用户终止了这个应用呢。在这种情况下,必须使用默认状态初始化活动A。因此,您必须实现许多附加逻辑
最后,我将再一次重复这个主要思想:如果你不能绝对确定你必须优化内存使用,就不要优化内存使用 你应该设计你的应用程序,使它的内存使用率低,但你可以指望框架在内存管理方面做到最好。所以,不要在删除未使用的内容时太过努力,只有在你的应用程序明显占用了太多内存的情况下
当可用内存减少时,框架将停止并删除与当前任务无关的活动和服务。如果你的应用程序占用更多内存,框架将停止你在后台的活动。然后是与您的应用程序关联的服务,最后一个完成的将是当前活动
当框架停止活动时,它会记录活动堆栈、用于启动活动的意图以及onSaveInstanceState()返回的捆绑包,以便重新创建活动的最后一个已知状态。此外,框架还可以在不使用时卸载未使用的资源(可提取资源等),并在需要时重新加载它们。好的,因此出现以下情况:
A > onCreate
A > onStart
A > onResume
A > Use up a load of memory (A could even use up too much and crash)
A > Launch activity B
B > onCreate
A > onPause
B > onStart
A > onStop
B > onResume
B > Use up a load of memory
如果B占用了足够的内存,那么Android系统将终止活动A(您会注意到A的onPause和onStop方法已经被调用,因此它已经有机会保存其状态)
如果你按下后退按钮,Android系统将再次启动活动A(如果它很聪明,它应该记住它的最后一个状态),因此看起来用户好像什么都没发生过
因此,更清楚一点:如果你先启动B,然后完成a,B实际上只是替换活动堆栈中的a,按下活动B中的“后退”按钮将退出你的和应用程序,而不是返回到活动a
另一方面,如果您启动B而没有完成A,则按下B中的后退按钮将带您返回A。当活动A在后台时,它可能会被杀死以回收内存,但当用户浏览活动堆栈时,Android将根据需要重新创建它
另外,如果您有多个对象(如位图/绘图)的内存缓存,则通过软引用备份您的集合,以便GC可以在内存不足时清除这些对象。我知道我在Java中几乎没有控制权,尽管我可以控制它(例如,我在每次活动恢复时加载位图,并在每次暂停时卸载它,否则我会出现内存不足异常)。我的问题是关于资源,例如xml中定义的背景,如果它们在活动暂停时卸载。如果我应该