Activity中的四种启动模式

Activity启动方式有四种,分别是:

standard
singleTop
singleTask
singleInstance


可以根据实际的需求为Activity设置对应的启动模式,从而可以避免创建大量重复的Activity等问题。

设置Activity的启动模式,只需要在AndroidManifest.xml里对应的<activity>标签设置android:launchMode属性,例如:

[html] view plaincopy

  1. <activity  
  2.     android:name=".A1"  
  3.     android:launchMode="standard" />  


下面是四种模式的作用:

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

例如:
若我有一个ActivityA1, 上面有一个按可跳A1。那么如果我点,便会新启一个Activity A1叠在才的A1之上,再点,又会再新启一个在它之上……
back键会依照栈顺序依次退出。

singleTop
可以有多个例,但是不允多个相同Activity叠加。即,如果Activity栈顶候,启相同的Activity,不会建新的例,而会用其onNewIntent方法。

例如:
若我有两个ActivityB1,B2,两个Activity内容功能完全相同,都有两个按可以跳到B1或者B2,唯一不同的是B1standardB2singleTop
若我意打开的B1->B2->B2则实际打开的B1->B2(后一次意打开B2实际用了前一个的onNewIntent方法)
若我意打开的B1->B2->B1->B2则实际打开的序与意的一致,B1->B2->B1->B2


singleTask
只有一个例。在同一个用程序中启他的候,若Activity不存在,会在当前task创建一个新的实例,若存在,则会把task中在其之上的其它Activity destory掉并用它的onNewIntent方法。
如果是在用程序中启它,会新建一个task,并在task中启动这ActivitysingleTask许别Activity与其在一个task中共存,也就是,如果我在singleTask例中再打开新的Activity个新的Activity还是会在singleTask例的task中。

例如:
若我的用程序中有三个Activity,C1,C2,C3,三个Activity可互相启,其中C2singleTask模式,那么,无我在个程序中如何点,如:C1->C2->C3->C2->C3->C1-C2C1,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中有一个activitytaskId200,从它打开C2C2taskIdI不会200,例如C2taskId201,那么再从C2打开C1C3C2C3taskId201
注意:如果此你点home,然后再打开Other发现这时显示的肯定会是Other应用中的内容,而不会是我们应用中的C1 C2 C3中的其中一个。


singleInstance
只有一个例,并且例独立运行在一个task中,task只有例,不允Activity存在。

例如:
程序有三个ActivityD1,D2,D3,三个Activity可互相启,其中D2singleInstance模式。那么程序从D1开始运行,假D1taskId200,那么从D1D2时,D2会新启一个task,即D2D1不在一个task中运行。假D2taskId201,再从D2D3时,D3taskId200,也就是它被到了D1的任务栈中。

若是在用程序打开D2,假OthertaskId200,打开D2D2会新建一个task运行,假它的taskId201,那么如果这时再从D2D1或者D3又会再建一个task,因此,若操作步骤为other->D2->D1这过程就涉及到了3task了。

 

猜你喜欢

转载自blog.csdn.net/sunxinghua08/article/details/84470144