在我的应用程序中的特定时间点,我想完全重启应用程序,即终止与应用程序关联的进程,然后再次重新启动它。我想这样做是为了释放堆空间,因为我的应用程序包含很多位图。
我使用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(),但它只释放了一小部分内存。
因此,我希望完全重启应用程序流程。
我刚看到这个:
此外,Android改变了位图内存的分配方式。在Android 3.0之前,位图在本机内存中分配,Java堆上只保留了一个小的描述符;现在整个位图是从Java堆分配的。如果多个位图保留在内存中,这可能会导致Java堆快速耗尽。
我想这就是为什么我的方法在2.3OS设备上运行而不在4.0 OS设备上的原因。
答案 0 :(得分:1)
你不应该致电System.exit(0)
。退出并重新启动应用程序是一个坏主意。
从https://groups.google.com/forum/#!topic/android-developers/G_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
另请查看内存管理
上的此链接https://www.youtube.com/watch?v=_CruQY55HOk
编辑:
您可以将onResume
中的drawable与onPause
中的unbind绑定。
答案 1 :(得分:1)
您无法清除堆。阅读this以便更好地理解。
希望它有所帮助。
答案 2 :(得分:0)
试试这个。它对我有用:
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);
答案 3 :(得分:0)
根据某些人的建议,我得出结论,当应用程序运行时,通过代码退出/重启应用程序并不理想/建议。
所以,我所做的是 - 设置一个标志来识别主页按钮点击ieexit of app
那时,我致电android.os.Process.killProcess(android.os.Process.myPid());
完全取消当前应用的流程并避免在后台运行应用。
全部谢谢!
答案 4 :(得分:0)
在how to programmatically "restart" android app?中尝试Oleg Koshkin的最高投票答案。希望这会对你有所帮助。
Intent mStartActivity = new Intent(context, StartActivity.class);
int mPendingIntentId = 123456;
PendingIntent mPendingIntent = PendingIntent.getActivity(context, mPendingIntentId, mStartActivity, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, mPendingIntent);
System.exit(0);