android - 重新启动应用程序以释放堆内存

标签 android android-intent application-restart

在我的应用程序的特定时间点,我想完全重新启动该应用程序,即终止与该应用程序关联的进程,然后再次重新启动它。我想这样做以释放堆空间,因为我的应用程序包含大量位图。

我用了this SO link获得最高投票答案并创建以下额外 Activity :

/** This activity shows nothing; instead, it restarts the android process */
public class MagicAppRestart extends Activity {
    // Do not forget to add it to AndroidManifest.xml
    // <activity android:name="your.package.name.MagicAppRestart"/>
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        System.exit(0);
    }
    public static void doRestart(Activity anyActivity) {
        anyActivity.startActivity(new Intent(anyActivity.getApplicationContext(), MagicAppRestart.class));
    }
}

并从另一个 Activity 的所需位置将此 Activity 称为 MagicAppRestart.doRestart(this);

现在,问题是这在 android 2.3 上运行良好,但在 4.0 上,此代码仅退出应用程序但不要重新启动它

我做错了什么吗?针对此问题是否存在适用于所有操作系统的解决方案?

此外,我已经尝试过以下代码,它会重启但不会重启进程,因此不会释放堆,因此对我来说没有用:

Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage( getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);

感谢任何帮助!

编辑

我的应用程序中有 7 个 Activity ,包括家庭 Activity 。除了 home activity,其他 6 个 activity 使用 ViewFlipper,有 5-8 个屏幕。

我在每个 Activity 的 onStop()onDestroy() 中使用 unbindDrawables() 但它只释放了一小部分内存。

因此,我希望完全重启应用进程。

编辑2

我刚刚遇到这个:

此外,Android 更改了位图内存的分配方式。在 Android 3.0 之前,位图是在 native 内存中分配的,只有一个小的描述符保留在 Java 堆中;现在整个位图是从 Java 堆中分配的。如果多个位图保存在内存中,这会导致 Java 堆很快用完。

我想这就是为什么我的方法适用于 2.3OS 设备而不适用于 4.0OS 设备的原因。

最佳答案

您无法清除堆。阅读this以便更好地理解。

希望对您有所帮助。

关于android - 重新启动应用程序以释放堆内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19313236/

相关文章:

c# - 使用命令行参数的 Application.Restart()

c - 从 Bash 终端重新启动 C 程序

java - 如何获取当前的屏幕方向?

Android 后退按钮和进度对话框

android - 如何重新启动 Android Activity?

永不停止的android持久性 Activity

android - Intent 调用操作不适用于 Marshmallow

java - Android 主/细节流程

android - Canvas 旋转后更改 RectF 的坐标

android - 如何以我可以看到收件箱、已发送邮件等的方式从我的应用程序启动电子邮件客户端