android - 为什么人们喜欢在 android 中配对 CLEAR_TOP 和 SINGLE_TOP

标签 android android-intent android-activity

标志 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/

相关文章:

java - 方法引用需要 API 级别 22

在 Activity 以外的类中使用的 Android Context

android - 如果子 Activity 崩溃,则返回父 Activity

java - onActivityResult 没有给出任何结果

android - 无法获取用户使用我的 Android 应用程序的国家/地区

android - Google Sceneform – 是否已弃用?有替代品吗?

Android Toolbar 为不同的 Fragment 添加菜单项

Android:从应用程序类启动新 Activity

android - 返回应用时的静态变量null

android - 在 XDK 的中心放置一行