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

Nil*_*ils 56 android kill

可能重复:
退出应用程序 - 这是不赞成的吗?

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

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

我怎样才能做到这一点?

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

Thi*_*van 104

当您使用finish()方法时,它不会完全关闭该进程,它仍然在后台运行.

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

@Override
public void onBackPressed() {

    android.os.Process.killProcess(android.os.Process.myPid());
    // This above line close correctly
}
Run Code Online (Sandbox Code Playgroud)

  • 这将终止进程,但它不一定会杀死内存中的任务.因此,当重新启动应用程序时,活动堆栈(任务)将从上次重新创建. (15认同)
  • 是的,我根本不喜欢这个解决方案.杀死该过程会消除您可能需要保存数据或完成任何待处理任务的任何机会.这就像关闭你的应用程序时最直率的洞穴人一样,应该不惜一切代价避免. (5认同)
  • 为什么应用程序在杀死进程后重新启动 (2认同)

mtm*_*ock 38

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

每次启动Activity时,都要使用它startActivityForResult(...).如果要关闭整个应用,可以执行以下操作:

setResult(RESULT_CLOSE_ALL);
finish();
Run Code Online (Sandbox Code Playgroud)

然后定义每个活动的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);
}
Run Code Online (Sandbox Code Playgroud)

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

此外,我在他的建议中支持CommonsWare:将密码存储在变量中,以便在应用程序关闭时将其销毁.


Eri*_*ski 13

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

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

上面的代码清除除LoginActivity之外的所有活动.LoginActivity是用户运行程序时提出的第一个活动.然后将此代码放入LoginActivity的onCreate中,以指示何时传递'Exit'消息时它应该自毁.

    if (getIntent().getBooleanExtra("EXIT", false)) {
         finish();
    }
Run Code Online (Sandbox Code Playgroud)

从Android平台得到的这个问题的答案是:"不要制作退出按钮.完成用户不再需要的活动,活动管理器会根据需要清理它们."

  • 是的,但请记住,android非常努力不让程序员能够为他们的应用程序创建"退出"按钮.所以你必须欺骗语言让你退出应用程序,慢慢地爬上它,让它认为你只想停止一些活动,然后潜入最后的命令,让最后一个活动结束.这有点像是通过分散他的注意力来越过一名保安,然后在他不看的时候跑过来. (4认同)

Com*_*are 7

只要应用程序需要它,它就存储在SharesPreferences中.

为什么?

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

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

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


Jor*_*sys 6

使用onBackPressed()方法:

@Override
public void onBackPressed() {    
    android.os.Process.killProcess(android.os.Process.myPid());
}
Run Code Online (Sandbox Code Playgroud)

或者使用finish()方法,我有类似的东西

//Password Error, I call function
    Quit();             


    protected void Quit() {
        super.finish();
    }
Run Code Online (Sandbox Code Playgroud)

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


tla*_*ton 3

我对Android应用程序框架的理解是这是明确不允许的。当应用程序不再包含当前活动时,它会自动关闭。试图创建一个“杀死”按钮显然与应用系统的预期设计背道而驰。

为了获得您想要的效果,您可以使用 startActivityForResult() 启动各种活动,并让退出按钮发回一个结果,告诉父活动完成 finish()。然后,该活动可以发送相同的结果作为其 onDestroy() 的一部分,这将级联回主活动并导致没有正在运行的活动,这将导致应用程序关闭。