Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
活动生命周期中的android内存管理_Android_Memory_Android Activity - Fatal编程技术网

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

活动生命周期中的android内存管理,android,memory,android-activity,Android,Memory,Android Activity,我的问题有点复杂 我想了解当活动开始,然后暂停时,应用程序如何处理资源(特别是背景图像、按钮等) 例如,我启动活动A,它在屏幕上显示所有图像,占用内存,然后启动另一个活动B,暂停A。所有图像、资源等会发生什么变化。?他们什么时候获释?我怎样才能控制他们?我是否应该将活动A保留在内存中并将其从活动堆栈中删除 如果您需要我的问题的任何澄清,请写信给我 提前谢谢! Danail在编写Java代码时,对内存的控制非常有限。对于大多数情况来说,这是一件好事。实际上,大多数应用程序不需要担心内存问题 为了回

我的问题有点复杂

我想了解当活动开始,然后暂停时,应用程序如何处理资源(特别是背景图像、按钮等)

例如,我启动活动A,它在屏幕上显示所有图像,占用内存,然后启动另一个活动B,暂停A。所有图像、资源等会发生什么变化。?他们什么时候获释?我怎样才能控制他们?我是否应该将活动A保留在内存中并将其从活动堆栈中删除

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

提前谢谢!
Danail

在编写Java代码时,对内存的控制非常有限。对于大多数情况来说,这是一件好事。实际上,大多数应用程序不需要担心内存问题


为了回答您的问题,活动A的所有对象在挂起时仍将在内存中。VM将在需要资源时启动GC

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

  • 根据活动的生命周期,如果我们调用
    finish()
    ,则调用
    onStop()
    ,最后调用
    onDestroy()
    ,它将该活动用于垃圾收集并从Android的活动堆栈中移除

  • 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中定义的背景,如果它们在活动暂停时卸载。如果我应该