关于android:如何使用其所有活动杀死应用程序?

How to kill an application with all its activities?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Quitting an application - is that frowned upon?

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

一旦用户想要退出,就应该清除sharedreferences中的密码,当然应用程序的所有活动都应该关闭(没有已知密码运行它们是没有意义的——它们会崩溃)。

我该怎么做?

System.exit(0)finish()只退出当前活动-无用。我知道有一个TaskManager应用程序。那是怎么做到的?它可以杀死整个应用程序…


当使用finish()方法时,它不会完全关闭进程,它仍在后台工作。

请在主要活动中使用此代码(请不要在每个活动或子活动中使用此代码):

1
2
3
4
5
6
@Override
public void onBackPressed() {

    android.os.Process.killProcess(android.os.Process.myPid());
    // This above line close correctly
}


您是正确的:调用finish()只会退出当前活动,而不会退出整个应用程序。但是,有一个解决方法:

每次启动一个活动时,都使用startActivityForResult(...)启动它。当你想关闭整个应用程序时,你可以这样做:

1
2
setResult(RESULT_CLOSE_ALL);
finish();

然后定义每个活动的onActivityResult(...)回调,当活动返回RESULT_CLOSE_ALL值时,它也调用finish()

1
2
3
4
5
6
7
8
9
10
@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);
}

这将导致关闭所有活动的级联效应。

另外,我在他的建议中支持通用软件:将密码存储在一个变量中,这样当应用程序关闭时,它就会被销毁。


当用户希望退出所有打开的活动时,他们应该按下一个按钮,加载应用程序启动时运行的第一个活动,在我的例子中是"LoginaActivity"。

1
2
3
4
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"消息时发出自毁信号。

1
2
3
    if (getIntent().getBooleanExtra("EXIT", false)) {
         finish();
    }

你从Android平台上得到的答案是:"不要按下退出按钮。完成用户不再需要的活动,活动管理器将根据需要对其进行清理。"


which is stored in the
SharesPreferences as long as the
application needs it.

为什么?

As soon as the user wants to exit, the
password in the SharedPreferences
should be wiped and of course all
activities of the application should
be closed (it makes no sense to run
them without the known password - they
would crash).

更好的是:不要在SharedPreferences中输入密码。在静态数据成员中保留它。当应用程序中的所有活动都退出(例如,后退按钮)或以其他方式销毁(例如,在用户按下主页后某个时间将RAM踢出以腾出空间进行其他活动)时,数据将自然消失。

如果您需要某种主动的"刷新密码",只需将静态数据成员设置为null,让您的活动检查该成员,并在它是null时采取适当的操作。


采用onBackPressed()法:

1
2
3
4
@Override
public void onBackPressed() {    
    android.os.Process.killProcess(android.os.Process.myPid());
}

或者使用finish()方法,我有一些

1
2
3
4
5
6
7
//Password Error, I call function
    Quit();            


    protected void Quit() {
        super.finish();
    }

使用super.finish()可以关闭super类的活动。


我对Android应用程序框架的理解是,这是特别不允许的。当应用程序不再包含当前活动时,它将自动关闭。试图创建"kill"按钮显然与应用程序系统的预期设计相反。

要获得所需的效果,可以使用startActivityForResult()启动各种活动,并让"退出"按钮返回一个结果,该结果指示父活动完成()。然后,该活动可以将相同的结果作为OnDestroy()的一部分发送,这将返回到主活动并导致没有正在运行的活动,这将导致应用程序关闭。