【发布时间】:2013-10-11 08:05:34
【问题描述】:
在我的应用程序的特定时间点,我想完全重新启动应用程序,即终止与应用程序关联的进程,然后再次重新启动它。我想这样做以释放堆空间,因为我的应用程序包含很多位图。
我使用投票最高的this SO link 并创建了以下额外活动:
/** 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 个屏幕。
我在每个活动的onStop() 和onDestroy() 中都使用了 unbindDrawables(),但它只释放了一小部分内存。
因此,我希望完全重启应用进程。
编辑 2
我刚遇到这个:
此外,Android 改变了位图内存的分配方式。在 Android 3.0 之前,位图分配在本机内存中,Java 堆上只保留一个小的描述符;现在整个位图都是从 Java 堆中分配的。如果在内存中保存多个位图,这可能会导致 Java 堆很快用完。
我想这就是为什么我的方法适用于 2.3OS 设备而不是 4.0 OS 设备的原因。
【问题讨论】:
-
你为什么要重启你的应用`,也许我们可以帮你做一个其他的方法
-
如问题所述:释放堆空间,因为我的应用包含大量位图...
-
@GAMA 在销毁活动之前调用
bitmap.recycle()。这会有所帮助 -
如果您正在处理图像,也可以看看这个:developer.android.com/training/displaying-bitmaps/…
-
我是从 xml 而不是从 java 类设置位图
标签: android android-intent application-restart