如何在活动进入堆栈时释放内存?

时间:2014-06-17 08:49:18

标签: android memory-management back-stack

我的应用程序包含(例如)3个活动:Activity1,Activity2,Activity3。每个活动在XML文件中声明的所有主要布局上都有唯一的背景图像。 从Activity1用户转到Activity2并在Activity3旁边,因此第一个2被推入堆栈。 问题是前两个活动占用了太多内存,而在Activity3中我有时会遇到OOM异常。 我找到了关于这种行为的原因的答案 - https://stackoverflow.com/a/4836241/1159507 在此之前,我相信当活动进入堆栈时它会释放所有内存。 我相信片段堆栈的行为相同。 所以我的问题是 - 如何在活动或片段进入堆叠时保留内存并在后退时保持负责的UI?

2 个答案:

答案 0 :(得分:1)

您可以将所有耗费大量内存的对象(例如:大型图片)保存到第一个活动的onStop()中的本地存储中,当用户按下时,您可以将其加载到onStart()你的第一个活动。

答案 1 :(得分:1)

当活动进入后台时,活动的资源(未在onPause,onStop,...中发布)不会被释放。

  • 你可以删除onPause()中的背景,就像GC一样 能够摧毁它。然而,"空背景"将在那里 几分之一秒。重要的是要提到,你必须这样做 在onPause()中执行此操作。 (我认为onPause之后的更改(如onStop中的更改)会在Activity到达前台时生效,因此当Activity在后台时,对background的引用仍将保留。)
  • 其他方式是调用finish(),并自己管理堆栈。您 必须记住启动Activity,然后导航到它 用户按下后退按钮时手动。
  • 我想到的最后一个解决方案是通过在清单中声明android:process属性,使包含大量资源的每个Activity成为一个单独的进程。这样,您的所有活动都将具有单独的完整大小的堆。