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 了。