在活动生命周期中的android内存pipe理

我的问题有点复杂

我想了解当Activity开始时,应用程序如何处理资源(尤其是背景,button等的图像),然后暂停。

例如,我开始活动A,它显示屏幕上的所有图像,吃掉它的内存,然后另一个活动B被启动,A被暂停。 所有的图像,资源等发生了什么? 当他们被释放? 我怎样才能控制他们? 我是否应该将活动A保留在内存中并将其从活动堆栈中移除?

如果您需要澄清我的问题,请写信给我!

提前致谢! Danail

Solutions Collecting From Web of "在活动生命周期中的android内存pipe理"

活动在完成之前不会释放资源。 但是在大多数情况下,这对你来说肯定不成问题。 在我看来,你不应该添加自己的资源pipe理,并在大多数情况下使你的代码复杂。

但是,如果你真的认为你的应用程序可能是内存不足,你应该像MAT一样检查它。 内存问题可能由内存泄漏引起,而不是内存使用量过大。

最后,当你确定你必须做一些事情来减less内存使用量时,你可以做一些内存优化。 例如,可以将耗费内存的对象(例如大图像)保存到onStop()本地存储器中,并将其加载到onStart() 。 我认为使用onPause() / onResume()来达到这个目的是个不错的主意,因为Activity是部分甚至完全可见的。

理论上,你甚至可以在onStop()销毁所有的小部件,并在onStart()恢复它们,但是它可能会让你的应用程序太慢。 当然,在这种情况下,状态保存必须由您来执行。

整理活动似乎是一个好主意,但我认为不是。 首先它会让你的工作变慢。 其次,你必须自己pipe理活动堆栈和活动状态。 例如,活动A启动活动B.因此,活动B必须知道当用户按下“后退”button时要执行的操作。 当用户按下后退button时,您应该启动活动A并恢复其状态。 但是,如果用户终止这个应用程序。 在这种情况下,您必须使用其默认状态初始化活动A. 所以,你必须实现很多额外的逻辑。

总之,我会再次重复这个主要的想法:如果你不是绝对肯定的话,不要优化内存使用。

好的,我们有以下情况:

 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方法已经被调用,所以已经有机会保存它的状态)

如果你按下后退button,Android系统将再次启动活动A(如果它是聪明的,它应该记住它是最后一个状态),所以它看起来像什么都没有发生过的用户。

所以要更清楚一点:如果你开始B然后完成A,B将基本上只取代活动栈中的A,然后按下活动B中的后退button将退出你的应用程序而不返回到活动A.

另一方面,如果你从B开始而没有完成A,那么按下B中的后退button会将你带回到A.当A在后台时它可能被杀死以回收内存,但是Android将会根据需要重新创build它。用户浏览活动堆栈。

另外,如果您有多个对象的内存caching(例如位图/可绘制),则通过SoftReferences备份您的集合,以便GC可以在内存不足时将其清除。

你应该devise你的应用程序,以便它的内存使用率很低,但是你可以指望这个框架在内存pipe理上最好。 所以,不要在删除不用的东西时努力工作,只有在显然你的应用程序吃了太多内存的情况下。

当可用内存下降时,框架将停止并删除与当前任务无关的活动和服务。 如果你的应用程序吃了更多的内存,框架将停止你的活动在后台。 然后是与您的应用程序相关的服务,最后一个将完成当前的活动。

当框架停止一个活动时,它会保留活动堆栈的logging,用于启动活动的意图以及由onSaveInstanceState()返回的包,因此可以重新创build活动的最后已知状态。 此外,框架可以在不使用时卸载未使用的资源(可绘制等),并在需要时重新加载它们。

在回答你的问题之前,我有一些事实要讨论。

  1. 根据Activity的生命周期,如果我们调用finish()那么调用onStop() ,最后调用onDestroy() ,这样就可以将Activity作为垃圾收集并从Android的Activity Stack中移除。

  2. Android正在维护可绘制的caching,用于屏幕上的活动devise和显示。 所以如果你禁用了Activity onCreate()的可绘制caching。

所以最好的做法是像这样在onCreate上禁用可绘制的caching:

  LinearLayout v = (LinearLayout) findViewById(R.id.mainLayout); v.setDrawingCacheEnabled(false); 

并调用finish(); onPause() ;

编写Java代码时,对内存的控制很less。 对大多数情况来说,这是一件好事。 其实大部分的应用程序不需要担心内存。

要回答你的问题,活动A的所有对象在暂停时仍然在内存中。 虚拟机将在需要资源时启动GC。