如何通过按后退按钮关闭非root活动的Android应用程序

时间:2014-01-21 16:33:06

标签: android login exit activity-lifecycle

我想在我的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返回到登录屏幕。所以我确实覆盖了onBackPressed()中的方法MainMenuActivity。相反,我希望当用户从主菜单按下后退按钮时,应用程序会终止(就像它在堆栈上的最后一个活动一样)。 如何实现这一目标?

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

https://stackoverflow.com/a/3008684/1332314

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

2 个答案:

答案 0 :(得分:1)

显然我确实找到了解决问题的方法。我只是从MainMenuActivity这样开始LoginActivity

private void continueToMainMenu() {
    Intent intent = new Intent(this, MainMenuActivity.class);
    startActivityForResult(intent, 0);
}

然后,当用户按下主菜单中的后退按钮时,将调用此覆盖函数:

public void onBackPressed() {
    setResult(LoginActivity.ACTION_QUIT);
    finish();
}

这将首先为LoginScreen设置结果代码,然后完成MainMenuActivity。然后LoginActivity终止接收这个特定的结果代码,我实现了这样的结果:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == LoginActivity.ACTION_QUIT)
    {
        finish();
    }
}

这样做可以确保不会触及活动生命周期太深,所有要清理的回调仍然会被调用,并且不应该打开任何安全漏洞。

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

答案 1 :(得分:1)

移至MainMenuActivity时使用此标记:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
                | Intent.FLAG_ACTIVITY_CLEAR_TASK);

这将删除之前的所有活动,如果您按后退应用将被关闭。

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