android:launchMode 有关 activity 如何启动的说明。共有五种模式可与 Intent 对象中的 activity 标志(FLAG_ACTIVITY_* 常量)协同工作,以确定在调用 activity 处理 intent 时应执行的操作: "standard" "singleTop" "singleTask" "singleInstance" "singleInstancePerTask"
默认模式为 "standard"。
如下表所示,这些模式可分为两大类:"standard" 和 "singleTop" activity 是一类,"singleTask"、"singleInstance" 和 "singleInstancePerTask" activity 是另一类。启动模式为 "standard" 或 "singleTop" 的 activity 可以多次实例化。
实例可归属任何任务,并且可位于 activity 任务中的任何位置。通常,它们会启动到名为 startActivity() 的任务中,除非 Intent 对象包含 FLAG_ACTIVITY_NEW_TASK 指令,在这种情况下会选择其他任务。如需了解详情,请参考 taskAffinity 属性。
相比之下,"singleTask"、"singleInstance" 和 "singleInstancePerTask" activity 的行为有所不同。"singleInstancePerTask" 始终位于 activity 任务的根位置。此外,设备一次只能保留一个 "singleInstance" activity 实例,而 "singleInstancePerTask activity 在 FLAG_ACTIVITY_MULTIPLE_TASK 或 FLAG_ACTIVITY_NEW_DOCUMENT 已设置的情况下,在不同的任务中可以多次实例化。
启动模式为 "singleTask" 的 activity 结合了 "singleInstance" 和 "singleInstancePerTask" 的行为:activity 可以多次实例化,并且可以位于具有相同 taskAffinity 的任务中的任意位置。但是,设备只能保留一个用于在 activity 任务的根位置查找 "singleTask" activity 的任务。
"standard" 和 "singleTop" 模式在某一方面有所不同:每当 "standard" activity 有新的 intent 时,系统都会创建类的新实例来响应该 intent。 每个实例处理单个 intent。同样地,您也可以创建新的 "singleTop" activity 实例来处理新的 intent。
不过,如果目标任务的 activity 堆栈顶部已有一个 activity 实例,则该实例会通过调用 onNewIntent() 接收新的 intent。系统不会创建新实例。否则,如果 "singleTop" activity 的一个现有实例在目标任务中,但不在堆栈顶部,或者它位于堆栈顶部,但不在目标任务中,则系统将创建一个新实例并将其推送到堆栈中。
同样地,如果用户向上导航到当前堆栈上的某个 activity,则该行为由父 activity 的启动模式决定。如果父 activity 有启动模式 singleTop(或者 up intent 包含 FLAG_ACTIVITY_CLEAR_TOP),则系统会将该父项置于堆栈顶部,并保留其状态。
导航 intent 由父 activity 的 onNewIntent() 方法接收。如果父 activity 有启动模式 standard(并且 up intent 不包含 FLAG_ACTIVITY_CLEAR_TOP),则系统会将当前 activity 及其父项同时送出堆栈,并创建新的父 activity 实例来接收导航 intent。
"singleInstance" 模式与 "singleTask" 和 "singleInstancePerTask" 也只有一点不同:启动模式为 "singleTask" 或 "singleInstancePerTask" 的 activity 允许其他 activity (必须是 "standard" 和 "singleTop" activity)是其任务的一部分。
另一方面,"singleInstance" activity 不允许其他 activity 成为其任务的一部分。它必须是任务中唯一的 activity。如果它启动另一个 activity,则系统会将该 activity 分配给其他任务,就如同 intent 中包含 FLAG_ACTIVITY_NEW_TASK 一样。
用例 启动模式 多个实例? 备注 大多数 activity 的正常启动 "standard" 是 默认。系统始终会在目标任务中创建新的 activity 实例,并向其传送 intent。 "singleTop" 视情况而定 如果目标任务的顶部已存在 activity 实例,则系统会通过调用该实例的 onNewIntent() 方法向其传送 intent,而非创建新的 activity 实例。 专用启动 (不建议用作常规用途) "singleTask" 视情况而定 系统会在新任务的根位置创建 activity,或将该 activity 放置在具有相同 affinity 的现有任务上。如果任务的根位置已存在 activity 实例,则系统会通过调用现有实例的 onNewIntent() 方法(而非创建新的 activity 实例),向其传送 intent。 "singleInstance" 否 与 "singleTask" 相似,唯一不同的是系统不会将任何其他 activity 启动到包含该实例的任务中。该 activity 始终是其任务中的唯一 activity。 "singleInstancePerTask" 视情况而定 此 activity 只能作为任务的根 activity、作为创建该任务的第一个 activity 运行,因此在任务中该 activity 只有一个实例。但是 activity 可以在不同的任务中多次实例化。 如上表所示,"standard" 是默认模式,适用于大多数类型的 activity。对众多类型的 activity 而言,"singleTop" 也是常见且有用的启动模式。其他模式("singleTask"、"singleInstance" 和 "singleInstancePerTask")不适用于大多数应用。它们所形成的交互模式可能让用户感到陌生,并且与大多数其他应用差别较大。
无论您选择哪种启动模式,在 activity 启动期间以及使用返回按钮从其他 activity 和任务返回该 activity 时,请务必对其进行易用性测试。
如需详细了解启动模式及其与 Intent 标志的交互,请参阅任务和返回堆栈。
