【问题标题】:How to close an Android app from non-root activity by pressing the backbutton如何通过按后退按钮从非 root 活动中关闭 Android 应用程序
【发布时间】:2014-01-21 16:33:06
【问题描述】:

我想在我的 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);

我还希望用户不能使用后退按钮从主菜单返回到登录屏幕。所以我确实在我的MainMenuActivity 中覆盖了onBackPressed() 方法。相反,我希望当用户从主菜单中按下后退按钮时,应用程序会终止(就像它在堆栈上的最后一个活动一样)。 我怎样才能做到这一点?

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

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

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

【问题讨论】:

  • 你使用 api 11+ 级吗?
  • 实际上是 14+,所以我不知道我刚刚发布的内容是否对每个人都有用。如果您知道针对这种高 API 级别的更好解决方案,请告诉我。
  • 检查我的答案。只需在您开始登录或主菜单活动时设置该标志

标签: android login exit activity-lifecycle


【解决方案1】:

当你移动到MainMenuActivity时使用这个标志:

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

这将删除所有以前的活动,如果你按下返回应用程序将被关闭。

现在,当您移动到 ​​LoginActivity 时,如果注销按钮执行相同的操作,现在相同的标志将使 LoginActivity 作为堆栈上的唯一活动,并且后面的应用程序将被关闭。

【讨论】:

  • 到目前为止我认为最好和最干净的方法。如果我遇到缺点,我会告诉你,谢谢!
【解决方案2】:

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

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();
    }
}

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

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

【讨论】:

  • 确实有帮助!担心我必须编写大量接口代码才能捕获另一个活动的结果(强制输入对话框)
  • 不建议将此作为通用解决方案,因为用户可能从另一个应用程序进入您的应用程序。如果是这种情况,用户会期望点击返回将他们带回打开您的应用程序的应用程序。相反,我推荐 @vipul mittal 推荐的内容,它会重写历史记录,因此后退按钮的行为符合用户的预期
  • 是的,我没有考虑这一点,但无论如何我认为他的回答更干净。这就是我很久以前接受它的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多