【问题标题】:how to make the appliction exit when pressing back button in the main activity?在主活动中按下后退按钮时如何使应用程序退出?
【发布时间】:2012-05-31 15:09:26
【问题描述】:

在我的应用程序中,当我单击后退按钮时,它会通过我之前打开的所有活动,我使用 public void onBackPressed() 方法将后退按钮返回到我想要的活动,如下所示

public void onBackPressed()
  {
    startActivity(new Intent("com.MyDiet.Main"));
    Tracker.this.finish();
  }

这是编写返回按钮的真正安全方法吗?当按下后退按钮时,如何防止应用程序通过所有以前打开的活动?当我单击主活动中的后退按钮时,如何使应用程序退出?

【问题讨论】:

  • 如果主要活动是指当前显示的活动,则只需在每次 startActivity/startActivityForResult 后调用 Activity.finish()
  • 我的意思是主活动是基本活动“启动屏幕之后的第一个午餐活动”,而不是制作退出按钮来退出应用程序,我想在后退按钮上这样做

标签: java android


【解决方案1】:

在您的应用程序和所有 android 应用程序中,除非不通过不必要的步骤(例如,如果您已经登录,请登录)至关重要,否则不要覆盖 Android 标准行为非常重要。用户通常会抱怨 Android 应用没有共同的行为或风格指南。

无论如何,是的,您可以在所有活动上覆盖 onBackPressed 并做任何您想做的事情。但不要这样做。

【讨论】:

  • “但是不要”为什么?这会影响活动信息吗?
  • 他在谈论用户的期望。在这种情况下,用户可能不知道你是如何编写代码的,也许他甚至不会注意到任何异常(如果你已经来到Tracker from Main),但从 onBackPressed 开始活动并不常见,因此其他开发人员或您在几个月内将遇到问题来完成代码和应用程​​序流程.. :S btw.to 在您的应用程序标准中实现所需的 UI 行为或效果应该遵循规则和用户期望,但有时我们需要覆盖一些方法..
【解决方案2】:

这种方法不好,因为您正在污染应用程序的活动堆栈

例子:

当前堆栈:MainAct -> Act2 -> Act3(我们在活动 3 中)

使用上面的代码,当您按下返回时,堆栈现在如下所示:

MainAct -> Act2 -> MainAct

因为你结束了 Act3 并启动了一个新的主要活动,这可能不是你想要的。

要实现你想要的(当前活动结束时返回主活动),你需要处理中间活动:在上面的例子中,当你从 Act2 调用 startActivity("Act3") 时,你应该调用 "这个.finish()”。因此,您不必重写活动 3 的“onBackPressed()”:只需默认值将终止 Act3,堆栈中的下一个活动将是 MainAct

MainAct -> A2 (A2 启动 A3 然后调用 this.finish())

MainAct -> A3(用户现在按回)

MainAct(mainactivity 现在在顶部)

总而言之,您不必重写 onBackPressed,您只需正确管理活动在主活动和当前活动之间的生命周期。

【讨论】:

    【解决方案3】:

    一般来说,不建议让事情像用户不期望的那样工作,这被认为是非常糟糕的做法。这就是为什么从覆盖的onBackPressed() 开始活动并不好。

    默认情况下,当用户按下返回时,活动将完成并显示来自back stack 的一个。作为开发人员,您将(通过编写代码)决定是哪一个。你可以这样做,但以后(或为其他人)会有点混乱,很难找到这个不寻常的地方来存放启动其他活动的代码。

    所以..阅读activity lifecycleback stack 对了解它的工作原理和更好地理解术语很有帮助。

    如果您希望您的某个活动不留在后台堆栈中,您可以为该活动添加manifest file 文件android:noHistory="true"

    您可以通过在启动活动时向 Intent 添加适当的标志来从代码中实现相同的目标:Intent.FLAG_ACTIVITY_NO_HISTORY

    当用户“离开”ActivityOne(开始使用意图或在manifest 中定义,如所述),到新的ActivityTwo,然后按回,它不会转到 ActivityOne,因为它不会在后台堆栈上。使用它,您可以精确控制活动的导航。

    More flags 可以使用,但我想这就是你想要实现的。

    希望您会发现我的回答很有用。干杯..

    【讨论】:

    • 非常感谢您,它非常有用,我想知道以下哪个是退出应用程序的最佳方法:添加退出菜单项以退出应用程序或让应用程序在单击时正常退出后退按钮?你能帮我吗
    • 您可以覆盖 onBackPressed,因为您尝试对排除 startActivity(new Intent("com.MyDiet.Main")); 行稍作更改。假设:public void onBackPressed() { Tracker.this.finish(); } 其他选项,添加退出菜单将具有相同的 finish() 调用。所以这两种方法都具有相同的结果,而不是那么不寻常的做法。但是你可能有兴趣阅读@RetoMeier 关于后退按钮和退出应用程序的帖子。 goo.gl/E4iR 他是领先的 google android 工程师之一,他建议由 Android OS 处理这些事情。有些人同意,有些人不同意..
    【解决方案4】:

    您可以使用很多技巧来退出您的完整应用程序,我使用这个启动一个意图,然后从 androidmanifest 中选择要归类的类别,然后关闭当前活动,例如您的主要活动!

    public void onBackPressed() {
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_HOME);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        startActivity(intent);
        finish();
    }
    

    【讨论】: