活动回栈 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
启动A
和FLAG_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的主要内容,如果未能解决你的问题,请参考以下文章
Android中维护标准应用Activity回栈状态(使用singleTask启动模式)