活动后台堆栈 FLAG_ACTIVITY_NEW_TASK

问题描述

我对启动模式的文档有点困惑。文档特别提到:

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

但稍后在 FLAG_ACTIVITY_NEW_TASK 部分提到:

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

这里没有说明是否 Activity 位于堆栈的顶部,这让我想知道如果不重新排列堆栈怎么可能。
例如,如果我们有活动 A 和 B,并且 A 启动 B:

A

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

B 或者我们有:
A

解决方法

假设两个 Activity 具有相同的 taskAffinity,您有以下场景:

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

A->B(A 是根 Activity,B 在栈顶并显示给用户)

现在,如果 B 启动 A,您将得到:

A->B->A'(A 是根,B 在 A 的顶部,A'(Activity 的另一个实例 A 在 B 的顶部并显示给用户。{在这种情况下不会调用 {1}}。

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

添加 finish() 对此完全没有影响。


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


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

,

添加到 backstack 的所有目的地都将弹出,直到您请求的目的地为止。因此,在您的情况下,结果应该只是具有 onNewIntent() 方法调用的活动 A。请参阅此 article 中有关任务和 backstack 的示例