Dan*_*ail 23 memory android android-activity
我的问题有点复杂.
我想了解应用程序在Activity启动后如何处理资源(尤其是背景,按钮等图像),然后暂停.
例如,我启动活动A,它显示屏幕上的所有图像,吃掉它的内存,然后启动另一个活动B并暂停A. 所有图像,资源等都会发生什么?当他们被释放?我该如何控制它们?我不应该将活动A保留在内存中并将其从活动堆栈中删除吗?
如果您需要澄清我的问题,请写信给我!
提前致谢!Danail
Mic*_*ael 21
活动在完成之前不会释放资源.但在大多数情况下,对你来说一定不是问题.在我看来,在大多数情况下,您不应该添加自己的资源管理并使代码变得复杂.
但如果你真的认为你的应用程序可能内存不足,你应该用MAT之类的东西来检查它.内存问题可能是由内存泄漏引起的,而不是内存使用量过大.
最终,当您完全确定必须做一些事情来减少内存使用时,您可以进行一些内存优化.例如,您可以将占用内存的对象(例如大图像)保存到本地存储中onStop()并加载它们onStart().我认为使用onPause()/ onResume()为此目的是一个坏主意,因为Activity部分甚至完全可见.
从理论上讲,您甚至可以销毁所有小部件onStop()并将其恢复onStart(),但它可能会使您的应用程序太慢.当然,在这种情况下,必须由您实施状态保存.
整理活动似乎是一个好主意,但我认为不是.首先,它会让你的工作变慢.其次,您必须自己管理活动堆栈和活动状态.例如,活动A启动活动B.因此,当用户按下"返回"按钮时,活动B必须知道该怎么做.当用户按下后退按钮时,您应该启动活动A并恢复其状态.但是如果用户终止此应用程序该怎么办 在这种情况下,您必须使用其默认状态初始化活动A. 所以,你必须实现许多额外的逻辑.
总之,我将再次重复这个主要想法:如果你不完全确定你必须要优化内存使用!
Jos*_*arl 10
好的,我们有以下情况:
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
Run Code Online (Sandbox Code Playgroud)
如果B耗尽了足够的内存,那么Android系统会杀死活动A(你会注意到A的onPause和onStop方法已被调用,所以它已经有机会保存它的状态)
如果你然后按下后退按钮,Android系统将再次启动活动A(如果它很聪明,它应该记住它的最后状态),所以看起来用户没有发生任何事情.
所以更清楚一点:如果你开始B然后完成A,B基本上只是替换活动堆栈中的A并按活动B中的Back按钮将退出你的应用程序而不返回活动A.
另一方面,如果你在没有完成A的情况下启动B,那么按下B中的后退按钮会将你带回A.虽然活动A在后台可能会被杀死以回收内存,但Android会根据需要重新创建它.用户浏览活动堆栈.
此外,如果您有多个对象的内存缓存(例如位图/可绘制对象),则通过SoftReferences返回您的集合,以便GC可以在内存不足时清除它们.