Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过按backbutton从非root活动关闭Android应用程序_Android_Login_Exit_Activity Lifecycle - Fatal编程技术网

如何通过按backbutton从非root活动关闭Android应用程序

如何通过按backbutton从非root活动关闭Android应用程序,android,login,exit,activity-lifecycle,Android,Login,Exit,Activity Lifecycle,我想在我的Android应用程序中建模的功能是,如果用户登录,他将被转发到主菜单(MainMenuActivity)。从这里以及我在应用程序中为其提供按钮的任何地方,他必须能够注销,这将使他返回登录屏幕(LoginActivity),并完成堆栈上的所有活动。我通过在登录后和注销调用时不破坏LoginActivity来实现这一点: Intent intent = new Intent(this, LoginActivity.class); // Clean up all other

我想在我的Android应用程序中建模的功能是,如果用户登录,他将被转发到主菜单(
MainMenuActivity
)。从这里以及我在应用程序中为其提供按钮的任何地方,他必须能够注销,这将使他返回登录屏幕(
LoginActivity
),并完成堆栈上的所有活动。我通过在登录后和注销调用时不破坏LoginActivity来实现这一点:

    Intent intent = new Intent(this, LoginActivity.class);
    // Clean up all other activities.
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    startActivity(intent);
另外,我希望用户不能使用backbutton从主菜单返回loginscreen。因此,我确实在我的
main活动中覆盖了方法
onBackPressed()
。相反,我希望当用户从主菜单按下backbutton时,应用程序确实会终止(就像它是堆栈上的最后一个活动一样)我如何才能做到这一点?

我确实读过其他几种方法,例如,在执行登录后完成LoginActivity,然后按照此处描述的方式进行操作:


但我不太确定这是否是一个合适的解决方案,请阅读帖子下方的评论。

显然,我确实找到了解决问题的方法。我只是从
LoginActivity
启动
MainMenuActivity
,如下所示:

private void continueToMainMenu() {
    Intent intent = new Intent(this, MainMenuActivity.class);
    startActivityForResult(intent, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == LoginActivity.ACTION_QUIT)
    {
        finish();
    }
}
然后,当用户按下主菜单中的backbutton时,将调用此覆盖函数:

public void onBackPressed() {
    setResult(LoginActivity.ACTION_QUIT);
    finish();
}
这将首先为
LoginScreen
设置结果代码,然后完成
main活动。然后,
LoginActivity
确实会终止接收这个特定的resultcode,我是这样实现的:

private void continueToMainMenu() {
    Intent intent = new Intent(this, MainMenuActivity.class);
    startActivityForResult(intent, 0);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == LoginActivity.ACTION_QUIT)
    {
        finish();
    }
}
这样做将确保不会触及太深的活动生命周期,所有要清理的回调仍将被调用,并且不应打开任何安全漏洞


如果其他人遇到同样的问题,希望这能有所帮助。

当您转到
main活动时,请使用此标志:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                | Intent.FLAG_ACTIVITY_CLEAR_TASK);
这将删除所有以前的活动,如果您按“上一步”,应用程序将关闭


现在,在注销按钮的情况下,当您移动到
LoginActivity
时,做同样的事情。相同的标志现在将使LoginActivity成为堆栈上的唯一活动,并且在后台应用程序将关闭。

实际上,您使用的是api级别11+?14+,所以我不知道我刚才发布的内容是否对每个人都有用。如果你知道一个更好的解决方案,为这个高API水平,只要让我知道。检查我的答案。只要在您开始登录或主菜单活动时设置该标志,到目前为止,我认为这是最好、最干净的方法。如果我遇到缺点,我会让你知道,谢谢!确实有用!我担心我必须编写大量的界面代码才能捕获另一个活动(强制输入对话框)的结果。我不建议将此作为一般解决方案,因为用户可能是从另一个应用程序输入您的应用程序的。如果是这样的话,用户会期望点击“返回”,将他们带回打开你的应用程序的应用程序。相反,我推荐的是@ VIPUL MITAL推荐的,它重写历史,所以后退按钮表现为用户预期,我没有考虑过,但不管怎样,我认为他的答案更干净。这就是我很久以前接受它的原因。