如何使用其所有活动杀死应用程序?

时间:2010-06-23 21:24:47

标签: android kill

  

可能重复:
  Quitting an application - is that frowned upon?

我想为用户提供退出应用程序的选项,因为我需要删除一些敏感数据,只要应用程序需要它就会存储在SharedPreferences中。

一旦用户想要退出,应该擦除SharedPreferences中的密码,当然应该关闭应用程序的所有活动(没有已知密码运行它们是没有意义的 - 它们会崩溃)。 / p>

我该怎么做?

System.exit(0)finish()仅退出当前活动 - 无用。我知道有一个taskmanager应用程序。怎么那样呢?它能够杀死整个应用程序......

6 个答案:

答案 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()的一部分,它将级联回主活动并导致没有正在运行的活动,这将导致应用程序关闭。