【问题标题】:FLAG_ACTIVITY_NEW_TASK clarification needed需要 FLAG_ACTIVITY_NEW_TASK 澄清
【发布时间】:2023-03-09 14:52:01
【问题描述】:

所以我的问题是:

  • 我启动 App1,打开 Screen1,然后打开 Screen2。
  • 我按 Home,将 App1 留在后台。
  • 我打开 App2,使用 FLAG_ACTIVITY_NEW_TASK 启动 App1.Screen1,期望在之前离开的任务中位于 App1.Screen2 上。相反,我在 App1.Screen1 和系统调用 onNewIntent()。

当我按下它时,它再次带来了 Sceen2 和 Screen1。 我不使用任何其他意图标志或启动模式。

有人能解释一下发生了什么吗?

【问题讨论】:

    标签: android android-intent


    【解决方案1】:

    Android 存在大量与活动和任务相关的错误。

    尽管如此,谷歌在操作系统版本之间改变了任务的行为并且没有通知开发者,这是它最烦人的地方。

    jakk - 如果您没有在活动(A 或 B)上设置任何标志,那么您所描述的行为是错误。

    对于所有说文档没有问题的人,试试这个:

    1. 使用 Activity A(启动 Activity)和 B(使用两者的默认启动模式)创建一个应用程序。
    2. 启动应用程序 - 仅使用活动 A 创建任务。
    3. 从活动 A 中的按钮启动活动 B,并带有 FLAG_ACTIVITY_NEW_TASK。
    4. 多次单击按钮,您会看到在任务中多次创建了活动 B,这与文档中的说法不符。

    还有更多的场景可以证明文档是BAD / WRONG。

    【讨论】:

    • 发生这种情况是因为taskAffinity 优先于FLAG_ACTIVITY_NEW_TASK。如果您希望 ActivityB 与 ActivityA 处于不同的任务中,您需要给它一个不同的taskAffinity。但是,是的,我同意,有大量与活动和任务相关的错误 :-)
    • 根据文档,似乎如果我们以意图 (FLAG_NEW_TASK) 启动一个活动,并且如果该活动存在于其他任务中,则完整的任务将被带到现有任务上方的前台。没有指定目标活动的位置,似乎活动在后堆栈中的位置无关紧要。我的结论对吗?
    • 聚会有点晚了,但问题仍然存在,这完全令人憎恶。你是绝对正确的 。 NEW_TASK 不像记录的那样工作,我不知道为什么人们甚至与你争论它。很简单,启动活动A和B。然后从 B 启动带有 NEW TASK 标志的 A。根据文档,如果 A 存在于任务中,则不会再次启动。然而确实如此..WTAF
    • 这已经改变了:developer.android.com/reference/android/content/…我建议你相应地更新你的答案:)
    【解决方案2】:

    试试这个。它对我有用。

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

    【讨论】:

      【解决方案3】:

      在您打开 App2 并使用 Intent.FLAG_ACTIVITY_NEW_TASK 启动 App1.Screen1 的第三步中,您还需要设置 Intent.FLAG_ACTIVITY_SINGLE_TOP 以使其执行您想要的操作。这是一个Android错误:-(

      请注意,如果您是第一次从 IDE(IntelliJ、Eclipse)启动应用程序,或者在通过市场(Google Play)或从浏览器下载安装应用程序后,该行为也会出现问题。见How to prevent multiple instances of an activity when it is launched with different intents和http://code.google.com/p/android/issues/detail?id=26658

      【讨论】:

        【解决方案4】:

        这似乎与http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html 上的文档一致。

        FLAG_ACTIVITY_NEW_TASK 等价于 launchMode=singleTask ,我在里面读到了

        但是,如果活动的实例已经存在于单独的 任务,系统通过 调用它的 onNewIntent() 方法,而不是创建一个新实例

        在没有 FLAG_ACTIVITY_NEW_TASK 的情况下启动活动应该会给您预期的行为。

        【讨论】:

        • 所以问题出在系统内部? :)
        • 据我所知,没有问题 :-) 系统的行为与记录的一样。
        • 这是不正确的。医生。表示未创建活动的新实例,并且在活动的现有实例上调用onNewIntent()。这不是正在发生的事情(实际上正在创建活动的一个新实例)。不仅如此,如果您考虑这一点,这毫无意义:如果我有一个包含 ActivityA 的任务 在 ActivityA 之上,我怎么可能在 ActivityA 的现有实例上调用 onNewIntent() ?它不是顶级活动,因此无法做出反应,并且要使其成为顶级活动需要重新排序堆栈。
        • 如果您希望活动的新实例可以在另一个任务中运行,您需要将 FLAG_ACTIVITY_MULTIPLE_TASK 与 FLAG_ACTIVITY_NEW_TASK 结合使用。这可能会导致问题,因为如果应用程序进入后台然后恢复,我无法弄清楚如何从新任务返回到旧任务。
        【解决方案5】:

        我们必须使用两个标志,即:

        1. Intent.FLAG_ACTIVITY_NEW_TASK
        2. Intent.FLAG_ACTIVITY_CLEAR_TASK

        第一个标志将简单地将一个活动添加到生命周期,就像将一个元素添加到堆栈中一样。

        第二个标志将简单地从堆栈中删除第一个活动,以便当用户导航回主屏幕时,他将无法看到该活动,只能看到第二个活动。

        【讨论】:

          【解决方案6】:

          FLAG_ACTIVITY_NEW_TASK 将您的新活动放在新的任务堆栈上。我将把活动称为 A 和 B。

          当您启动第一个应用程序时,您有一个包含 A 的任务。任务 1 = A

          单击第二个活动将 B 放入任务中。任务 1 = AB

          当您单击主页时,您会保留该任务。任务 1 = AB(静止)

          打开第二个应用程序并发送带有新任务标志的 A 意图,将创建一个新任务,其中只有 A。现在你有两个任务。任务 1 = AB,任务 2 = A

          使用返回键解开此排列将产生 2A、1B、1A,这就是您所看到的。这是预期的结果。

          【讨论】:

          • 我认为在这种情况下不会创建新任务(因为活动已经存在于单独的任务中)
          • 这不是真的。当您运行第二个应用程序并使用 FLAG_ACTIVITY_NEW_TASK 发送 A 意图时,它会将现有任务带到前台(应该如此),然后在该任务中创建另一个 Activity A 实例(这是不正确的行为)。它不像它应该工作的那样工作(或像它记录的那样)。
          猜你喜欢
          • 2011-11-09
          • 2012-07-18
          • 1970-01-01
          • 1970-01-01
          • 2012-06-02
          • 2017-01-18
          • 2016-06-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多