在我的应用程序中的特定时间点,我希望完全重新启动应用程序,即杀死与应用程序相关的进程,然后重新启动它。我想这样做,以释放堆空间,因为我的应用程序包含很多位图。
我使用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);。
现在,问题是这在Android2.3上运行得很好,但是在4.0上,这段代码只退出应用程序,但是没有重新启动。
我做错什么了吗?对于这个问题是否有一个在所有操作系统上都能工作的解决方案?
另外,我已经尝试了以下代码,它重新启动了但不是进程,因此没有释放堆,所以它对我没有任何用处:
Intent i = getBaseContext().getPackageManager().getLaunchIntentForPackage( getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);任何帮助都很感激!
编辑
我有7个活动在我的应用程序,包括家庭活动。除家庭活动外,其他6个活动使用带有5-8屏幕的ViewFlipper。
我在每个活动的unbindDrawables()中使用onStop()和onDestroy(),但是它只释放内存的一小部分。
因此,我希望完全重新启动应用程序进程。
编辑2
我刚发现了这个:
此外,Android改变了位图内存的分配方式。在Android3.0之前,位图是在本机内存中分配的,只有一个小描述符保存在Java堆上;现在整个位图是从Java堆中分配的。如果内存中保存了多个位图,这可能导致Java堆很快被耗尽。
我想这就是为什么我的方法在2.3OS的设备上工作,而不是在4.0操作系统的设备上工作的原因。
发布于 2013-10-11 08:07:40
您不应该调用System.exit(0)。退出并重新启动应用程序是个坏主意。
引用D3pKnGLt0的Romain Guy的话
(Romain Guy):用户没有,系统会自动处理这个问题。这就是活动生命周期(特别是onPause/onStop/onDestroy)的目的。无论您做什么,不要放置“退出”或“退出”应用程序按钮。对于Android的应用模型来说,这是毫无用处的。这也与核心应用程序如何工作相反。
要了解更多信息,请查看下面的链接
Is quitting an application frowned upon?
您应该以这样的方式编写代码,这样才不会遇到内存泄漏。
管理位图存储器
http://developer.android.com/training/displaying-bitmaps/manage-memory.html
还请检查内存管理上的此链接。
编辑:
您可以在onResume中绑定可绘制的对象,在onPause中绑定取消绑定。
发布于 2013-10-11 08:22:16
你不能清理这堆东西。阅读this以获得更好的理解。
希望能帮上忙。
发布于 2013-10-11 08:06:59
尝尝这个。它适用于我:
Intent it = new Intent();
it.setComponent(new ComponentName(YourActivity.this.getPackageName(),YourActivity.class.getName()));
it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK| Intent.FLAG_ACTIVITY_SINGLE_TOP);
YourActivity.this.getApplicationContext().startActivity(it);https://stackoverflow.com/questions/19313236
复制相似问题