Activity有四种启动模式,分别为standard、singleTop、SingleTask、singleInstance。
- 使用方式
我们在AndroidManifest.xml中的Activity标签下,添加属性android:launchMode=“singleTop”即可使用。
<activity
android:name=".main.MainActivity"
android:launchMode="singleTask">
2. 区别
AndroidManifest中launchMode默认模式是“standard
”。
如下表所示,这些模式分为两大类:
用例 | 启动模式 | 多个实例? | 注释 |
---|---|---|---|
大多数 Activity 的正常启动 | “standard ” | 是 | 默认值。系统始终会在目标任务中创建新的 Activity 实例并向其传送 Intent。 |
“singleTop ” | 有条件 | 如果目标任务的顶部已存在一个 Activity 实例,则系统会通过调用该实例的 onNewIntent() 方法向其传送 Intent,而不是创建新的 Activity 实例。 | |
专用启动 (不建议用作常规用途) | “singleTask ” | 否 | 系统在新任务的根位置创建 Activity 并向其传送 Intent。 不过,如果已存在一个 Activity 实例,则系统会通过调用该实例的 onNewIntent() 方法向其传送 Intent,而不是创建新的 Activity 实例。 |
“singleInstance ” | 否 | 与“singleTask" ”相同,只是系统不会将任何其他 Activity 启动到包含实例的任务中。 该 Activity 始终是其任务唯一仅有的成员。 |
上面的表说的比较简单,下面详细说明:
-
standard
最简单最常用的启动模式。每次都会在栈顶创建新的Activity实例,并把Intent传递给这个Activity。 -
singleTop
和standard类似,唯一的区别就是,如果当前要启动的Activity在栈顶,那么系统会调用onNewIntent方法向已存在的这个Activity传递数据,不会再新创建Activity。 -
singleTask
如果被启动的Activity设置了 taskAffinity(用于指定Activity 任务栈),如果指定的task存在,则会将task移到前台;如果指定task不存在,则创建指定taskAffinity的task。 如果task中存在实例,则移除实例之上的所有实例并显示出来,执行原实例的onNewIntent(),否则创建实例进入task顶部。 -
singleInstance
启动一个新的任务栈,并新建Activity实例。如果已经存在这样的任务栈和Activity,则直接重新启动该Activity
注意:
1. 如果采用了非standard模式,则可能会导致onActivityResult异常。比如,在Android版本5.0以下的Android手机,目标Activity采用singleTask,在启动页的onActivityResult中,reulst_code一直是-1 。
2. 如果从一个任务栈切换到另外一个任务栈,则Activity返回时,总是先从当前任务栈弹出Activity,而不会切换到新的任务栈。所以如果是下,启动顺序中含有singleInstance模式的Activity,则返回顺序会发生变化。比如A B C 三个页面,其中B是singleInstance;AC是默认Standard。其中A启动B,B启动C,则返回的顺序变为C A B。