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:绝对清除活动的主要内容,如果未能解决你的问题,请参考以下文章

Android:清除活动堆栈

如何清除 Android Stack 的活动?

java Android调用新活动并清除所有其他活动。

Android:从历史堆栈中清除旧的活动实例

如何在Android中清除以前打开的活动

清除整个历史堆栈并在 Android 上启动一个新活动