标志 FLAG_ACTIVITY_CLEAR_TOP
找到包含 Activity X 的任务并清除顶部以使 X 进入其恢复状态。标记 FLAG_ACTIVITY_SINGLE_TOP
只会在顶部保留一个 X 实例。因此,如果我已经在使用 CLEAR_TOP
,我永远不需要包含 SINGLE_TOP
:那是因为 CLEAR_TOP
的行为包含 SINGLE_TOP
的行为。那么为什么这么多示例代码将两者一起包括在内呢?是因为那些开发人员不了解 CLEAR_TOP
的全部功能吗?同样,我在网上看到的几乎每个示例都将两者结合在一起。为什么要裁员?
例如,如果我在任务 W->X->Y->Z
上为 X 调用 CLEAR_TOP
,那么我会得到 W->X
。另一方面,如果我在任务 W->X->Y->Z
上为 X 调用 SINGLE_TOP,我最终会得到 W->X->Y-> Z->X
,如果我为 Z 调用它,我会得到 W->X->Y->Z
。所以实际上 CLEAR_TOP
没有给等式添加任何内容:这就像将 0 添加到其他值。
最佳答案
CLEAR_TOP
的行为是不同的,这取决于 Activity 是否是 singleTop
Activity 或是否还提供了标志 SINGLE_TOP
。
我们首先假设 Activity 具有标准启动模式(不是 singleTop
)。如果您使用 CLEAR_TOP
标志而不使用 SINGLE_TOP
,Android 会执行以下操作:
- 清除 Activity 堆栈回到(并包括)目标 Activity (通过完成堆栈中位于目标 Activity 顶部的所有 Activity 并完成目标 Activity 的现有实例)。
- 创建目标 Activity 的新实例,并在该实例上调用
onCreate()
。
相反,我们假设 Activity 仍然具有标准启动模式(不是 singleTop
)。如果您使用 CLEAR_TOP
标志连同 SINGLE_TOP
标志,Android 会执行以下操作:
- 清除 Activity 堆栈返回(但不包括)目标 Activity(通过完成堆栈中位于目标 Activity 之上的所有 Activity)。
- 在目标 Activity 的现有实例上调用
onNewIntent()
,传递在startActivity()
调用中使用的Intent
。
如您所见,行为有所不同。
注意:如果目标 Activity 在 list 中声明为 launchMode="singleTop"
,则使用 CLEAR_TOP
的行为应该与您还指定的行为相同SINGLE_TOP
。但是,Android 中有一些与此相关的错误(我暂时找不到链接)。因此,您不应依赖 launchMode
设置,但如果您不希望重新创建目标 Activity 的现有实例,请始终指定 SINGLE_TOP
标志。
关于android - 为什么人们喜欢在 android 中配对 CLEAR_TOP 和 SINGLE_TOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31926315/