Android:绝对清除活动
Posted
技术标签:
【中文标题】Android:绝对清除活动【英文标题】:Android: absolutely clear the activity 【发布时间】:2016-04-15 06:53:57 【问题描述】:我正在尝试处理 android 内存。问题是我想完全释放所有内存并开始一个新的活动。我找到了一些有用的答案:
Android: Clear the back stack
Android: Clear Activity Stack
Clear the entire history stack and start a new activity on Android
之后,我试着举两个例子:
第一个例子:
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
我正在使用上面的代码在两个活动 A 和 B 之间切换。这是内存消耗的图片:
第二个例子:
在 MainActivity 中:
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
startActivity(intent);
在 Main2Activity 中:
onBackPressed();
我也在两个活动之间切换。本例的内存消耗:
看起来像 Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK 并不是完全释放内存的完美方式。
我真的需要知道是否有像第二个示例那样释放所有内存?
提前谢谢你!
【问题讨论】:
为什么不直接调用finish();开始新活动后? 感谢您的评论,我的目标是在开始许多活动后释放内存,以使 onBackPressed() 或 finish() 函数无法满足我的需求。我做这个例子是因为我想确保 Android 可以以某种方式释放所有内存,但是 Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK 不能这样做 【参考方案1】:如果您遇到此问题,则您可能遇到了可以更优雅地解决的内存问题,例如通过修复内存泄漏并可能减小位图的大小。如果您没有任何内存泄漏,则如果程序接近堆中的空间不足,则应从内存中清除第一个 Activity。
但如果你真的、真的需要这样做,你可以这样做:
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
startActivity(intent);
System.exit(0);
这会在更改 Activity 时产生不希望的延迟,破坏 Android 后退按钮的“标准”使用,并可能产生其他负面影响(例如,如果您正在播放背景音乐),但它会确保内存使用从 0 重新开始。
【讨论】:
谢谢@kmell96!在我的第一个示例中,根本没有图像。我只有 2 个活动 A 和 B。通过使用该函数,我从 A 开始活动 B,然后再次从 B 开始 A。每当我开始一个新活动时,我设置标志 Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK 但不知何故它不能像函数 onBackPressed() 或 finish() 那样释放所有内存。【参考方案2】:将 android:noHistory="true" 属性添加到 AndroidManifest.xml 中的 <activity>
,如下所示:
<activity android:name=".MyActivity"
android:noHistory="true">
</activity>
设置标志
Intent i = new Intent(this, Splash.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
finish();
并检查此链接Changing activity in android clears the memory needed for the previous activities? 还有这个链接https://commonsware.com/blog/2011/10/03/activities-not-destroyed-to-free-heap-space.html
【讨论】:
【参考方案3】:以下是我完成 Activity 后释放内存的方法:
在你的activity的onDestroy()方法中添加
Runtime.getRuntime().gc();
在 Android 5.1.1、4.4 上测试 - 完美运行。
【讨论】:
@LuongTruong 还有一个技巧——我减小了用作背景的位图的大小。退出时,我已设法清除活动占用的大部分内存。 使用 gc() 是一个很好的指标,可以从根本上破坏代码。避免使用它。你不知道垃圾收集器会做什么以上是关于Android:绝对清除活动的主要内容,如果未能解决你的问题,请参考以下文章