如何杀死一个应用程序的所有活动?

可能重复:
退出申请 – 是不是皱起了眉头?

我想为用户提供退出应用程序的选项,因为我需要删除一些敏感数据,只要应用程序需要,它就存储在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。