https://developer.android.com/guide/topics/manifest/activity-element.html
android:launchMode
Intent
对象中的 Activity 标志(
FLAG_ACTIVITY_*
常量)协同工作,以确定在调用 Activity 处理 Intent 时应执行的操作。 这些模式是:
“standard
”
“singleTop
”
“singleTask
”
“singleInstance
”
默认模式是“standard
”。
如下表所示,这些模式分为两大类,“standard
”和“singleTop
”Activity 为一类,“singleTask
”和“singleInstance
”为另一类。使用“standard
”或“singleTop
”启动模式的 Activity 可多次实例化。 实例可归属任何任务,并且可以位于 Activity 堆栈中的任何位置。 它们通常启动到名为
的任务之中(除非 Intent 对象包含 startActivity()
指令,在此情况下会选择其他任务 — 请参阅 taskAffinity 属性)。FLAG_ACTIVITY_NEW_TASK
相比之下,“singleTask
”和“singleInstance
”Activity 只能启动任务。 它们始终位于 Activity 堆栈的根位置。此外,设备一次只能保留一个 Activity 实例 — 只允许一个此类任务。
“standard
”和“singleTop
”模式只在一个方面有差异: 每次“standard
”Activity 有新的 Intent 时,系统都会创建新的类实例来响应该 Intent。每个实例处理单个 Intent。同理,也可创建新的“singleTop
”Activity 实例来处理新的 Intent。 不过,如果目标任务在其堆栈顶部已有一个 Activity 实例,那么该实例将接收新 Intent(通过调用 onNewIntent()
);此时不会创建新实例。在其他情况下 — 例如,如果“singleTop
”的一个现有实例虽在目标任务内,但未处于堆栈顶部,或者虽然位于堆栈顶部,但不在目标任务中 — 则系统会创建一个新实例并将其推送到堆栈上。
同理,如果您向上导航到当前堆栈上的某个 Activity,该行为由父 Activity 的启动模式决定。 如果父 Activity 有启动模式 singleTop
(或 up
Intent 包含 FLAG_ACTIVITY_CLEAR_TOP
),则系统会将该父项置于堆栈顶部,并保留其状态。 导航 Intent 由父 Activity 的 onNewIntent()
方法接收。 如果父 Activity 有启动模式 standard
(并且 up
Intent 不包含 FLAG_ACTIVITY_CLEAR_TOP
),则系统会将当前 Activity 及其父项同时弹出堆栈,并创建一个新的父 Activity 实例来接收导航 Intent。
“singleTask
”和“singleInstance
”模式同样只在一个方面有差异: “singleTask
”Activity 允许其他 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 并向其传送 Intent。 不过,如果已存在一个 Activity 实例,则系统会通过调用该实例的 onNewIntent() 方法向其传送 Intent,而不是创建新的 Activity 实例。 |
“singleInstance ” | 否 | 与“singleTask" ”相同,只是系统不会将任何其他 Activity 启动到包含实例的任务中。 该 Activity 始终是其任务唯一仅有的成员。 |
如上表所示,standard
是默认模式,并且适用于大多数的 Activity 类型。对许多类型的 Activity 而言,SingleTop
也是一个常见并且有用的启动模式。 其他模式 — singleTask
和 singleInstance
- 不适合 大多数应用因为它们所形成的交互模式可能让用户感到陌生,并且与大多数其他应用迥异。
无论您选择哪一种启动模式,请务必在启动期间以及使用返回按钮从其他 Activity 和任务返回该 Activity 时对其进行易用性测试。
如需了解有关启动模式及其与 Intent 标志交互的详细信息,请参阅任务和返回栈文档。
下面的转自:http://blog.youkuaiyun.com/shinay/article/details/7898492/
Activity启动方式有四种,分别是:
standard
singleTop
singleTask
singleInstance
可以根据实际的需求为Activity设置对应的启动模式,从而可以避免创建大量重复的Activity等问题。
设置Activity的启动模式,只需要在AndroidManifest.xml里对应的<activity>标签设置Android:launchMode属性,例如:
下面是这四种模式的作用:
standard
默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。
例如:
若我有一个Activity名为A1, 上面有一个按钮可跳转到A1。那么如果我点击按钮,便会新启一个Activity A1叠在刚才的A1之上,再点击,又会再新启一个在它之上……
点back键会依照栈顺序依次退出。
singleTop
可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法。
例如:
若我有两个Activity名为B1,B2,两个Activity内容功能完全相同,都有两个按钮可以跳到B1或者B2,唯一不同的是B1为standard,B2为singleTop。
若我意图打开的顺序为B1->B2->B2,则实际打开的顺序为B1->B2(后一次意图打开B2,实际只调用了前一个的onNewIntent方法)
若我意图打开的顺序为B1->B2->B1->B2,则实际打开的顺序与意图的一致,为B1->B2->B1->B2。
singleTask
只有一个实例。在同一个应用程序中启动他的时候,若Activity不存在,则会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。
如果是在别的应用程序中启动它,则会新建一个task,并在该task中启动这个Activity,singleTask允许别的Activity与其在一个task中共存,也就是说,如果我在这个singleTask的实例中再打开新的Activity,这个新的Activity还是会在singleTask的实例的task中。
例如:
若我的应用程序中有三个Activity,C1,C2,C3,三个Activity可互相启动,其中C2为singleTask模式,那么,无论我在这个程序中如何点击启动,如:C1->C2->C3->C2->C3->C1-C2,C1,C3可能存在多个实例,但是C2只会存在一个,并且这三个Activity都在同一个task里面。
但是C1->C2->C3->C2->C3->C1-C2,这样的操作过程实际应该是如下这样的,因为singleTask会把task中在其之上的其它Activity destory掉。
操作:C1->C2 C1->C2->C3 C1->C2->C3->C2 C1->C2->C3->C2->C3->C1 C1->C2->C3->C2->C3->C1-C2
实际:C1->C2 C1->C2->C3 C1->C2 C1->C2->C3->C1 C1->C2
若是别的应用程序打开C2,则会新启一个task。
如别的应用Other中有一个activity,taskId为200,从它打开C2,则C2的taskIdI不会为200,例如C2的taskId为201,那么再从C2打开C1、C3,则C2、C3的taskId仍为201。
注意:如果此时你点击home,然后再打开Other,发现这时显示的肯定会是Other应用中的内容,而不会是我们应用中的C1 C2 C3中的其中一个。
singleInstance
只有一个实例,并且这个实例独立运行在一个task中,这个task只有这个实例,不允许有别的Activity存在。
例如:
程序有三个ActivityD1,D2,D3,三个Activity可互相启动,其中D2为singleInstance模式。那么程序从D1开始运行,假设D1的taskId为200,那么从D1启动D2时,D2会新启动一个task,即D2与D1不在一个task中运行。假设D2的taskId为201,再从D2启动D3时,D3的taskId为200,也就是说它被压到了D1启动的任务栈中。
若是在别的应用程序打开D2,假设Other的taskId为200,打开D2,D2会新建一个task运行,假设它的taskId为201,那么如果这时再从D2启动D1或者D3,则又会再创建一个task,因此,若操作步骤为other->D2->D1,这过程就涉及到了3个task了。
最后附上我测试的Demo:http://download.youkuaiyun.com/detail/shinay/4520903
android:launchMode
Intent
对象中的 Activity 标志(
FLAG_ACTIVITY_*
常量)协同工作,以确定在调用 Activity 处理 Intent 时应执行的操作。 这些模式是:
“standard
”
“singleTop
”
“singleTask
”
“singleInstance
”
默认模式是“standard
”。
如下表所示,这些模式分为两大类,“standard
”和“singleTop
”Activity 为一类,“singleTask
”和“singleInstance
”为另一类。使用“standard
”或“singleTop
”启动模式的 Activity 可多次实例化。 实例可归属任何任务,并且可以位于 Activity 堆栈中的任何位置。 它们通常启动到名为
的任务之中(除非 Intent 对象包含 startActivity()
指令,在此情况下会选择其他任务 — 请参阅 taskAffinity 属性)。FLAG_ACTIVITY_NEW_TASK
相比之下,“singleTask
”和“singleInstance
”Activity 只能启动任务。 它们始终位于 Activity 堆栈的根位置。此外,设备一次只能保留一个 Activity 实例 — 只允许一个此类任务。
“standard
”和“singleTop
”模式只在一个方面有差异: 每次“standard
”Activity 有新的 Intent 时,系统都会创建新的类实例来响应该 Intent。每个实例处理单个 Intent。同理,也可创建新的“singleTop
”Activity 实例来处理新的 Intent。 不过,如果目标任务在其堆栈顶部已有一个 Activity 实例,那么该实例将接收新 Intent(通过调用 onNewIntent()
);此时不会创建新实例。在其他情况下 — 例如,如果“singleTop
”的一个现有实例虽在目标任务内,但未处于堆栈顶部,或者虽然位于堆栈顶部,但不在目标任务中 — 则系统会创建一个新实例并将其推送到堆栈上。
同理,如果您向上导航到当前堆栈上的某个 Activity,该行为由父 Activity 的启动模式决定。 如果父 Activity 有启动模式 singleTop
(或 up
Intent 包含 FLAG_ACTIVITY_CLEAR_TOP
),则系统会将该父项置于堆栈顶部,并保留其状态。 导航 Intent 由父 Activity 的 onNewIntent()
方法接收。 如果父 Activity 有启动模式 standard
(并且 up
Intent 不包含 FLAG_ACTIVITY_CLEAR_TOP
),则系统会将当前 Activity 及其父项同时弹出堆栈,并创建一个新的父 Activity 实例来接收导航 Intent。
“singleTask
”和“singleInstance
”模式同样只在一个方面有差异: “singleTask
”Activity 允许其他 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 并向其传送 Intent。 不过,如果已存在一个 Activity 实例,则系统会通过调用该实例的 onNewIntent() 方法向其传送 Intent,而不是创建新的 Activity 实例。 |
“singleInstance ” | 否 | 与“singleTask" ”相同,只是系统不会将任何其他 Activity 启动到包含实例的任务中。 该 Activity 始终是其任务唯一仅有的成员。 |
如上表所示,standard
是默认模式,并且适用于大多数的 Activity 类型。对许多类型的 Activity 而言,SingleTop
也是一个常见并且有用的启动模式。 其他模式 — singleTask
和 singleInstance
- 不适合 大多数应用因为它们所形成的交互模式可能让用户感到陌生,并且与大多数其他应用迥异。
无论您选择哪一种启动模式,请务必在启动期间以及使用返回按钮从其他 Activity 和任务返回该 Activity 时对其进行易用性测试。
如需了解有关启动模式及其与 Intent 标志交互的详细信息,请参阅任务和返回栈文档。