我想为用户提供退出应用程序的选项,因为我需要删除一些敏感数据,只要应用程序需要它就会存储在SharedPreferences中。
一旦用户想要退出,应该擦除SharedPreferences中的密码,当然应该关闭应用程序的所有活动(没有已知密码运行它们是没有意义的 - 它们会崩溃)。 / p>
我该怎么做?
System.exit(0)
和finish()
仅退出当前活动 - 无用。我知道有一个taskmanager应用程序。怎么那样呢?它能够杀死整个应用程序......
答案 0 :(得分:98)
当你使用finish()方法时,它不会完全关闭进程,它仍然在后台工作。
请在主要活动中使用此代码(请勿在每项活动或子活动中使用):
@Override
public void onBackPressed() {
android.os.Process.killProcess(android.os.Process.myPid());
// This above line close correctly
}
答案 1 :(得分:36)
你是对的:调用finish()
只会退出当前活动,而不是整个应用程序。但是,有一个解决方法:
每次启动活动时,请使用startActivityForResult(...)
启动它。当您想要关闭整个应用时,您可以执行以下操作:
setResult(RESULT_CLOSE_ALL);
finish();
然后定义每个活动的onActivityResult(...)
回调,这样当活动返回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);
}
这将导致级联效应关闭所有活动。
另外,我在他的建议中支持CommonsWare:将密码存储在变量中,以便在应用程序关闭时将其销毁。
答案 2 :(得分:13)
当用户希望退出所有打开的活动时,他们应该按下一个按钮,加载应用程序启动时运行的第一个Activity,在我的案例中为“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平台获得此问题的答案是:“不要设置退出按钮。完成用户不再需要的活动,活动管理器会根据需要清理它们。”
答案 3 :(得分:7)
存储在 SharesPreferences只要 应用需要它。
为什么?
一旦用户想退出,就会 SharedPreferences中的密码 应该擦拭,当然所有 应用程序的活动应该 被关闭(运行没有意义 没有已知密码的他们 - 他们 会崩溃。)
更好:不要将密码放在SharedPreferences
中。在静态数据成员中保留它。当应用程序中的所有活动都退出(例如,BACK按钮)或以其他方式销毁时(例如,在用户按下HOME后的某个时间,踢出RAM以便为其他活动腾出空间),数据自然会消失。
如果您想要某种主动的“刷新密码”,只需将静态数据成员设置为null
,让您的活动检查该成员并在null
时采取适当的措施。
答案 4 :(得分:6)
使用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()可以关闭超类的活动。
答案 5 :(得分:3)
我对Android应用程序框架的理解是,这是特别不允许的。当应用程序不再包含当前活动时,它将自动关闭。尝试创建“kill”按钮显然与应用程序系统的预期设计相反。
要获得所需的效果,可以使用startActivityForResult()启动各种活动,并使用退出按钮发回一个结果,告知父活动完成()。然后,该活动可以发送相同的结果作为其onDestroy()的一部分,它将级联回主活动并导致没有正在运行的活动,这将导致应用程序关闭。