我的问题有点复杂。
我想了解应用程序在启动后如何处理资源(尤其是背景图像、按钮等),当Activity启动后再暂停时的情况。
例如,我启动Activity A,它显示屏幕上的所有图像,占用内存,然后启动另一个Activity B并将A挂起。所有的图像、资源等会发生什么?何时释放它们?我该如何控制它们?是否应该将Activity A从内存中移除并从Activity堆栈中删除?
如果您需要对我的问题进行澄清,请告诉我!
谢谢! 丹尼尔
我的问题有点复杂。
我想了解应用程序在启动后如何处理资源(尤其是背景图像、按钮等),当Activity启动后再暂停时的情况。
例如,我启动Activity A,它显示屏幕上的所有图像,占用内存,然后启动另一个Activity B并将A挂起。所有的图像、资源等会发生什么?何时释放它们?我该如何控制它们?是否应该将Activity A从内存中移除并从Activity堆栈中删除?
如果您需要对我的问题进行澄清,请告诉我!
谢谢! 丹尼尔
活动在完成之前不会释放资源。但在大多数情况下,这对你来说不应该是一个问题。在我看来,你不应该在大多数情况下添加自己的资源管理以及使你的代码复杂。
但是如果你真的认为你的应用程序可能会出现内存不足的情况,你应该使用类似于MAT的工具进行检查。内存问题可能是由于内存泄漏而不是内存使用过多引起的。
最终,当你完全确定必须采取一些措施以减少内存使用量时,你可以进行一些内存优化。例如,你可以在onStop()
中将占用大量内存的对象(如大型图像)保存到本地存储,并在onStart()
中加载它们。我认为使用onPause()
/onResume()
来实现这个目的是一个不好的主意,因为活动部分或甚至全部可见。
理论上,你甚至可以在onStop()
中销毁所有小部件,并在onStart()
中恢复它们,但这会使你的应用程序变得太慢。当然,在这种情况下,状态保存必须由你自己实现。
完成活动可能看起来是一个不错的主意,但我认为这不是。首先它会使你的工作变得更慢。其次,你必须自己管理活动堆栈和活动状态。例如,Activity A启动Activity B。那么,当用户按下返回按钮时,Activity B必须知道该做什么。当用户按下返回按钮时,你应该启动Activity A并恢复它的状态。但是如果用户终止了这个应用程序。在这种情况下,你必须使用默认状态初始化Activity A。因此,你必须实现许多额外的逻辑。
最后,我再重复一遍主要观点:如果你不完全确定必须优化内存使用,请不要这样做!
ImageView
的源代码,并不认为当活动停止时它会卸载它的可绘制对象。我也不认为TextView
会卸载它的文本。而且,实现你提到的方法意味着要进行自己的内存管理。如果你使用模型或者GUI的部分来实现,这并不重要。 - Michael好的,我们有以下情况:
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方法已经被调用,因此它已经有机会保存其状态)。finish()
,则会调用onStop()
,最终调用onDestroy()
,这使该Activity符合垃圾收集条件,并从Android的Activity堆栈中删除。onCreate()
中禁用了Drawable缓存,则会影响性能。onCreate
中禁用drawable缓存,如下所示: LinearLayout v = (LinearLayout) findViewById(R.id.mainLayout);
v.setDrawingCacheEnabled(false);
在 onPause()
中调用 finish();
方法。
在编写Java代码时,您对内存的控制很少。对于大多数情况来说这是一件好事。实际上,大多数应用程序不需要担心内存。
回答您的问题,当Activity A被挂起时,所有对象仍将保留在内存中。当VM需要资源时会启动GC。