如何杀死一个应用程序的所有活动?
可能重复:
退出申请 – 是不是皱起了眉头?
我想为用户提供退出应用程序的选项,因为我需要删除一些敏感数据,只要应用程序需要,它就存储在SharedPreferences中。
一旦用户想要退出,应该清除SharedPreferences中的密码,当然应该closures应用程序的所有活动(没有已知的密码运行它们是没有意义的 – 它们会崩溃)。
我怎样才能做到这一点?
System.exit(0)
和finish()
只能退出当前活动 – 没用。 我知道有一个taskmanager应用程序。 那个人怎么样? 它能够杀死整个应用程序…
当你使用finish()方法时,它不会完全closures这个过程,它仍然在后台工作。
请在主要活动中使用此代码(请勿在每个活动或子活动中使用):
@Override public void onBackPressed() { android.os.Process.killProcess(android.os.Process.myPid()); // This above line close correctly }
你是正确的:调用finish()
将只会退出当前的活动,而不是整个应用程序。 不过,这是一个解决方法:
每次启动一个Activity时,都要使用startActivityForResult(...)
来启动它。 当你想closures整个应用程序,你可以做这样的事情:
setResult(RESULT_CLOSE_ALL); finish();
然后定义每个活动的onActivityResult(...)
callback,所以当活动返回RESULT_CLOSE_ALL
值时,它也调用finish()
:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch(resultCode) { case RESULT_CLOSE_ALL: setResult(RESULT_CLOSE_ALL); finish(); } super.onActivityResult(requestCode, resultCode, data); }
这将导致级联效应closures所有活动。
另外,我在他的build议中支持CommonsWare:将密码存储在variables中,以便在应用程序closures时将其销毁。
当用户希望退出所有打开的活动时,他们应该按下一个button,加载您的应用程序启动时运行的第一个活动,在我的情况下是“LoginActivity”。
Intent intent = new Intent(getApplicationContext(), LoginActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra("EXIT", true); startActivity(intent);
上面的代码清除了除LoginActivity之外的所有活动。 LoginActivity是用户运行程序时提出的第一个活动。 然后把这段代码放在LoginActivity的onCreate中,当'Exit'消息通过时它会自毁。
if (getIntent().getBooleanExtra("EXIT", false)) { finish(); }
从Android平台得到这个问题的答案是:“不要做退出button,完成用户不再需要的活动,活动pipe理器将会按照自己的想法进行清理。”
只要应用程序需要,它就存储在SharesPreferences中。
为什么?
一旦用户想要退出,应该清除SharedPreferences中的密码,当然应该closures应用程序的所有活动(没有已知的密码运行它们是没有意义的 – 它们会崩溃)。
更好的是:不要把密码放在SharedPreferences
。 保持在一个静态数据成员。 当应用程序中的所有活动退出(例如BACKbutton)或以其他方式销毁时(例如,在用户按下HOME之后,从RAM中踢出以腾出空间用于其他活动),数据将自然消失。
如果你想要一些主动的“清除密码”,只要将静态数据成员设置为null
,并让你的活动检查该成员,并采取适当的行动,当它为null
。
使用onBackPressed()
方法:
@Override public void onBackPressed() { android.os.Process.killProcess(android.os.Process.myPid()); }
或者使用finish()
方法,我有类似的东西
//Password Error, I call function Quit(); protected void Quit() { super.finish(); }
用super.finish()closures超类的活动。
我对Android应用程序框架的理解是,这是特别不允许的。 如果应用程序不包含更多当前活动,它将自动closures。 尝试创build“kill”button显然与应用系统的预期devise相反。
为了得到你想要的效果,你可以用startActivityForResult()来启动你的各种活动,然后让退出button返回一个结果告诉父活动finish()。 然后,这个活动可以发送相同的结果作为它的onDestroy()的一部分,它将级联回主活动,并导致没有运行的活动,这应该导致应用程序closures。