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