天天看点

Activity的四种启动模式任务栈图解一、启动模式介绍二、启动模式介绍三、图解启动方式,彻底掌握启动模式

转载本专栏文章,请注明出处,尊重原创 。文章博客地址:道龙的博客

今天带来另一篇Activity的文章——Activity的四种启动模式。该篇文章,会以图文讲解的方式带你彻底掌握Activity的启动方式和常见场景。

一、启动模式介绍

     启动模式简单地说就是Activity启动时的策略,在AndroidManifest.xml中的标签的android:launchMode属性设置;

  启动模式有4种,分别为standard、singleTop、singleTask、singleInstance;

讲解启动模式之前,有必要先讲解一下“任务栈”的概念;

  任务栈

  每个应用都有一个任务栈,是用来存放Activity的,功能类似于函数调用的栈,先后顺序代表了Activity的出现顺序;比如Activity1-->Activity2-->Activity3,则任务栈为:

Activity的四种启动模式任务栈图解一、启动模式介绍二、启动模式介绍三、图解启动方式,彻底掌握启动模式

二、启动模式介绍

(1)standard:

每次激活Activity时(startActivity),都创建Activity实例,并放入任务栈;

Activity的四种启动模式任务栈图解一、启动模式介绍二、启动模式介绍三、图解启动方式,彻底掌握启动模式

(2)singleTop:

如果某个Activity自己激活自己,即任务栈栈顶就是该Activity,则不需要创建,其余情况都要创建Activity实例;

Activity的四种启动模式任务栈图解一、启动模式介绍二、启动模式介绍三、图解启动方式,彻底掌握启动模式

(3)singleTask:

如果要激活的那个Activity在任务栈中存在该实例,则不需要创建,只需要把此Activity放入栈顶,并把该Activity以上的Activity实例都pop;

Activity的四种启动模式任务栈图解一、启动模式介绍二、启动模式介绍三、图解启动方式,彻底掌握启动模式

(4)singleInstance:

如果应用1的任务栈中创建了MainActivity实例,如果应用2也要激活MainActivity,则不需要创建,两应用共享该Activity实例;

Activity的四种启动模式任务栈图解一、启动模式介绍二、启动模式介绍三、图解启动方式,彻底掌握启动模式

三、图解启动方式,彻底掌握启动模式

standard

默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。

例如:

若我有一个Activity名为A1, 上面有一个按钮可跳转到A1。那么如果我点击按钮,便会新启一个Activity A1叠在刚才的A1之上,再点击,又会再新启一个在它之上……

点back键会依照栈顺序依次退出。

这个很简单,就不需要用图例来说明了。

singleTop

可以有多个实例,但是不允许多个相同Activity叠加。即,如果Activity在栈顶的时候,启动相同的Activity,不会创建新的实例,而会调用其onNewIntent方法复用创建好的Activity,如果不在栈顶就会创建新的实例。

例如:

若我有两个Activity名为B1,B2,两个Activity内容功能完全相同,都有两个按钮可以跳到B1或者B2,唯一不同的是B1为standard,B2为singleTop。

若我意图打开的顺序为B1->B2->B2,则实际打开的顺序为B1->B2(后一次意图打开B2,实际只调用了B2的onNewIntent方法)

栈结构图解:

Activity的四种启动模式任务栈图解一、启动模式介绍二、启动模式介绍三、图解启动方式,彻底掌握启动模式

若我意图打开的顺序为B1->B2->B1->B2,则实际打开的顺序与意图的一致,为B1->B2->B1->B2。

栈结构图解:

Activity的四种启动模式任务栈图解一、启动模式介绍二、启动模式介绍三、图解启动方式,彻底掌握启动模式

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-C2

实际:C1->C2          C1->C2->C3           C1->C2                   C1->C2                                    

后面两个方式有些绕,我们通过图解方式一一说明:

(3)C1->C2->C3->C2

Activity的四种启动模式任务栈图解一、启动模式介绍二、启动模式介绍三、图解启动方式,彻底掌握启动模式

(4)C1->C2->C3->C2->C3->C1-C2

上边方式是C1->C2->C3->C2。我们在这个基础上继续分析,启动C1,会把C2销毁掉,继续启动C2,C2又前往栈顶。栈结构图解:

Activity的四种启动模式任务栈图解一、启动模式介绍二、启动模式介绍三、图解启动方式,彻底掌握启动模式

若是别的应用程序打开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中的其中一个。

栈结构图解:

Activity的四种启动模式任务栈图解一、启动模式介绍二、启动模式介绍三、图解启动方式,彻底掌握启动模式

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启动的任务栈中。

栈结构图解:

Activity的四种启动模式任务栈图解一、启动模式介绍二、启动模式介绍三、图解启动方式,彻底掌握启动模式

若是在别的应用程序打开D2,假设Other的taskId为200,打开D2,D2会新建一个task运行,假设它的taskId为201,那么如果这时再从D2启动D1或者D3,则又会再创建一个task,因此,若操作步骤为other->D2->D1,这过程就涉及到了3个task了。

栈结构图解:

Activity的四种启动模式任务栈图解一、启动模式介绍二、启动模式介绍三、图解启动方式,彻底掌握启动模式

相信Activity的四中启动模式,通过上述详细的概述以及栈结构图解的方式。您很快就能掌握里面的原理了。

喜欢我的朋友可以关注我的博客专栏。

也可以打开微信搜索公众号  Android小菜

或者扫描下方二维码关注。

Activity的四种启动模式任务栈图解一、启动模式介绍二、启动模式介绍三、图解启动方式,彻底掌握启动模式