Activity启动方式有四种,分别是:
standard
singleTop
singleTask
singleInstance
能够根据实际的需求为Activity设置对应的启动模式,从而能够避免建立大量重复的Activity等问题。
设置Activity的启动模式,只须要在AndroidManifest.xml里对应的<activity>标签设置android:launchMode属性,例如:html
下面是这四种模式的做用:
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打开C一、C3,则C二、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了。android