活动回栈 FLAG_ACTIVITY_NEW_TASK

Posted

技术标签:

【中文标题】活动回栈 FLAG_ACTIVITY_NEW_TASK【英文标题】:Activity backstack FLAG_ACTIVITY_NEW_TASK 【发布时间】:2021-07-16 18:38:03 【问题描述】:

我对启动模式的文档有点困惑。具体来说,文档提到:

堆栈中的活动永远不会重新排列,只会推送和弹出 从堆栈中

但稍后在FLAG_ACTIVITY_NEW_TASK 部分提到:

如果您现在开始的活动的任务已经在运行, 该任务被带到前台并恢复其最后状态 并且活动在 onNewIntent() 中接收到新的意图。

这里没有说明该活动是否位于堆栈顶部,这让我想知道如何在不重新排列堆栈的情况下实现这一点。 因此,例如,如果我们有活动 A 和 B 并且 A 启动 B:

A

现在如果B 启动AFLAG_ACTIVITY_NEW_TASK 是否意味着它将恢复之前的实例? IE。返回堆栈将是:

B 或者我们会有: A

【问题讨论】:

adb shell dumpsys activity 的帮助下测试应该相当容易。 【参考方案1】:

假设两个活动都有相同的taskAffinity,你有以下场景:

如果 A 启动 B,你有这个:

A->B(A 是根Activity,B 位于堆栈顶部并显示给用户)

现在,如果 B 启动 A,你有这个:

A->B->A'(A 是根,B 在 A 之上,A'(Activity A 的另一个实例在 B 之上并显示给用户。onNewIntent()在这种情况下不调用。

这假定您在再次启动 A 时不使用 FLAG_ACTIVITY_CLEAR_TOP,并且还假定 A 或 B 都没有调用 finish()

添加FLAG_ACTIVITY_NEW_TASK 对此完全没有影响。


注意:此外,文档中关于“活动从不重新排列”的说法实际上是错误的。我很确定我在 Google 上打开了一个关于此问题的问题大约 3 次,但是...无论如何,如果您使用 FLAG_ACTIVITY_REORDER_TO_FRONT,这会将 Activity 从堆栈中的任何位置移动到堆栈顶部。


另一个注意事项:另外,onNewIntent() 只在堆栈顶部的Activity 上调用(即:用户看到的那个)。

【讨论】:

文档虽然声明:the task is brought to the foreground with its last state restored,但这似乎只有在设置FLAG_ACTIVITY_CLEAR_TOP 时才会发生? 没有。仅当正在启动的Activity 是根Activity(在这种情况下就是这样)并且Activity另一个任务启动时,任务才会以其最后状态被带到前台>(在这种情况下不是)。 设置FLAG_ACTIVITY_CLEAR_TOP 用于从堆栈中移除活动。 “另一个任务”是什么意思?我不确定 android 有一个“任务”的概念,它是一系列活动。这些活动通常属于同一个应用程序,但这不是必需的。当您启动您的应用程序时,如果它尚未运行,Android 会创建一个新任务并将您的根 Activity 放入任务中。当您的Activity 启动另一个Activity 时,那个(通常但不总是)被添加到此任务中,等等。所以当我说“另一个任务”时,您可以将其读作“另一个应用程序”。这在技术上并不正确,但应该可以帮助您理解。【参考方案2】:

添加到后台堆栈的所有目标都将弹出,直到您请求的目标。因此,在您的情况下,结果应该只是带有 onNewIntent() 方法调用的活动 A。请参阅此article,其中包含有关任务和后台堆栈的示例

【讨论】:

以上是关于活动回栈 FLAG_ACTIVITY_NEW_TASK的主要内容,如果未能解决你的问题,请参考以下文章

活动回栈 FLAG_ACTIVITY_NEW_TASK

Android中维护标准应用Activity回栈状态(使用singleTask启动模式)

当 Fragment 被替换并放入回栈(或删除)时,它是不是保留在内存中?

回栈事务后如何持久化分片数据?

图片模式下 Android O 图片的任务列表和回栈

导航组件 NavDeepLinkBuilder 回栈