在我的应用程序的特定时间点,我想完全重新启动应用程序,即终止与应用程序关联的进程,然后再次重新启动它。我想这样做以释放堆空间,因为我的应用程序包含很多位图。
我使用此 SO 链接获得最高投票的答案,并创建了以下额外活动,如下所示:
/** 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));
}
}
并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 个活动,包括家庭活动。除家庭活动外,其他 6 项活动使用ViewFlipper
5-8 个屏幕。
我在每个活动中都使用了unbindDrawables()onStop()
,onDestroy()
但它只释放了一小部分内存。
因此,我希望完全重新启动应用程序进程。
编辑 2
我刚遇到这个:
此外,Android 改变了位图内存的分配方式。在 Android 3.0 之前,位图分配在本机内存中,Java 堆上只保留一个小的描述符;现在整个位图都是从 Java 堆中分配的。如果多个位图保存在内存中,这可能会导致 Java 堆很快用完。
我想这就是为什么我的方法适用于 2.3OS 设备而不是 4.0 OS 设备的原因。