Activity四种启动模式
来源:互联网 发布:2016安卓版录音软件 编辑:程序博客网 时间:2024/06/05 20:17
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
一样。
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.csdn.net/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.csdn.net/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
一样。
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 标志交互的详细信息,请参阅任务和返回栈文档。
- Activity四种启动模式
- activity四种启动模式
- activity四种启动模式
- Activity四种启动模式
- Activity四种启动模式
- Activity四种启动模式
- Activity四种启动模式
- Activity四种启动模式
- Activity四种启动模式
- Activity四种启动模式
- Activity四种启动模式
- Activity四种启动模式
- Activity四种启动模式
- Activity四种启动模式
- Activity四种启动模式
- Activity 四种启动模式
- Activity四种启动模式
- Activity四种启动模式
- 基本知识—依赖注入(Dependency Injection)
- 欢迎使用CSDN-markdown编辑器
- 求1到100质数加强2.0版,每5个数换行
- 整理文件夹==数据库
- ADB server didn't ACK * failed to start daemon * 解决方案
- Activity四种启动模式
- H5基础知识第八课时(flex布局)
- 测试国内开源数据库中间件Mycat和Atlas体会
- 数据仓库-BI商业智能
- 最近使用了asp.net,iis安装
- 项目中二级缓存理解,以hibernate为例
- Codeforces Round #363 (Div. 2) D. Fix a Tree —— 并查集
- c# 开源框架整理
- 人脸识别之人脸检测