【问题标题】:Activities Stack Issue活动堆栈问题
【发布时间】:2012-07-10 23:21:12
【问题描述】:

我有两组活动假设每组 3 个活动,(A1,B1,C1 || A2,B2,C2) 我从 A1 启动我的应用程序然后 -> B1 -> C1 这里我想从 C1 跳转到-> A2 和 A2 如果我按下它应该存在应用程序而不是让我返回 C1,然后从 A2 我导航到 -> B2 -> C2。

所以基本上我想更改启动 Activity,就像我在一个应用程序中有两个应用程序,当我翻转到第二个应用程序时,我必须清除 Activity Stack。那可能吗?有什么想法吗?

【问题讨论】:

    标签: java android stack android-activity


    【解决方案1】:

    在我看来,您已经回答了自己的问题。你写道:

    所以基本上我想改变启动Activity,就像 我在一个应用程序中有两个应用程序,当我切换到第二个应用程序时,我必须 清除 Activity Stack。

    我会这样做:

    创建一个DispatcherActivity,它是应用程序启动时启动的活动。此活动是您的任务的根活动,负责启动 A1 或 A2,具体取决于...,而不是自行调用 finish()(即:它将被 A1 或 A2 覆盖,但仍位于活动的根目录堆栈)。

    在A1 中,捕获“返回”键并告诉 DispatcherActivity 像这样退出:

    @Override
    public void onBackPressed() {
        Intent intent = new Intent(this, DispatcherActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.addExtra("exit", "true");
        startActivity(intent);
    }
    

    这会将任务堆栈清除到根 Activity (DispatcherActivity),然后以此意图再次启动 DispatcherActivity。

    在C1 中,要启动A2,请执行以下操作:

    Intent intent = new Intent(this, DispatcherActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.addExtra("A2", "true");
    startActivity(intent);
    

    这会将任务堆栈清除到根 Activity (DispatcherActivity),然后以此意图再次启动 DispatcherActivity。

    在DispatcherActivity 中,在onCreate() 中,您需要根据intent 中的额外内容确定要执行的操作,如下所示:

    Intent intent = getIntent();
    if (intent.hasExtra("exit")) {
        // User wants to exit
        finish();
    } else if (intent.hasExtra("A2")) {
        // User wants to launch A2
        Intent a2Intent = new Intent(this, A2.class);
        startActivity(a2Intent);
    } else {
        // Default behaviour is to launch A1
        Intent a1Intent = new Intent(this, A1.class);
        startActivity(a1Intent);
    }
    

    在A2 中,捕获“返回”键并告诉 DispatcherActivity 退出使用与A1 中相同的onBackPressed() 覆盖。

    注意:我只是输入了这段代码,所以我没有编译它,它可能并不完美。您的里程可能会有所不同;-)

    【讨论】:

    • 为您的努力+1,需要时间来检查它,但是如果我在到达 C1 之前决定在 B1 跳到 A2,这是否也有效?
    • 是的,当然。在 B1,您只需将 Intent 发送到 DispatcherActivity 并告诉它启动“A2”。这就是为什么你应该这样做。它非常灵活,您不需要太多额外的代码。
    • 如果我的应用程序启动画面必须在开始时显示一次,我该如何实现?因为在去 DispatcherActivity 之前我必须先去 SplashActivity?还是有另一种解决方法?谢谢
    • 没问题。启动画面是您开始的第一个活动(即:清单中有action.MAIN 和category.LAUNCHER)。它完成了它需要做的事情,然后启动DispatcherActivity 并自行调用finish()。现在只有DispatcherActivity 在活动堆栈中。其余的就像我描述的那样工作。
    【解决方案2】:

    您可以检查在 Activity A2 中按下按钮的时间,如果是返回按钮,您可以关闭应用程序。您可以在A2中使用以下方法

    @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                this.finish();
            }
            return super.onKeyDown(keyCode, event);
        }
    

    【讨论】:

    • 这不起作用。在 A2 中调用 finish() 不会关闭应用程序,它只会完成 A2 然后返回任务中的上一个活动(即 C1)
    • @DavidWasser 您可以关闭该 onKeyDown() 方法中的所有活动,以便关闭应用程序。 stackoverflow.com/questions/5453206/…
    【解决方案3】:

    尝试使用此意图启动活动 A2 - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    【讨论】:

    • 这不起作用。为此,A2 必须已经在活动堆栈中(在根目录),但它不是。
    • 是的,你可能是对的。必须再次检查文档。
    【解决方案4】:

    使用 onBackPressed 和 finish 方法处理此问题。

    在启动其他活动之前,最好使用 finish() 方法关闭当前活动。

    如果您想在后按时转到上一个活动,请覆盖 onBackPressed 方法并调用特定的意图。

    在A2活动中,在onBackPressed方法中添加finish方法(这里不要调用之前的活动)。这是方法之一。

    【讨论】:

      【解决方案5】:

      在将 Intent 从 Activity C1 传递到 A2 时用作

      Intent intent=new Intent(C1.this,A2.class);
      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      startActivity(intent);
      

      并在您的 Activity A2 中通过

      覆盖后退按钮
       @Override
      public boolean onKeyDown(int keyCode, KeyEvent event) {
          if (keyCode == KeyEvent.KEYCODE_BACK) {
              A2.this.finish();
          }
          return super.onKeyDown(keyCode, event);
      }
      

      【讨论】:

      • 这不起作用。为此,A2 必须已经在活动堆栈(在根)中,但它不是。
      【解决方案6】:

      如果您想在按下后退按钮而不是返回上一个活动时关闭您的应用,您应该覆盖后退按钮。在关闭活动后在覆盖方法中调用finish() 方法。我希望这可以帮助你。

      编辑:

      检查以下链接:这是为了关闭视图堆栈中的所有活动。在关闭您的应用之前关闭所有活动。

      http://www.coderzheaven.com/2011/08/27/how-to-close-all-activities-in-your-view-stack-in-android/

      【讨论】:

      • 这是不对的。使用noHistory 将阻止用户正常从A1->B1->C1 和A2->B2->C2 导航。方法错误。
      【解决方案7】:

      FLAG_ACTIVITY_CLEAR_TOP 不是您想要的。 我想你正在寻找:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-05
        • 1970-01-01
        • 1970-01-01
        • 2011-07-15
        • 1970-01-01
        • 2011-09-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多