我们知道,在Android中,launchMode在多个Activity跳转的过程中扮演着重要的角色,它可以决定是否生成新的Activity实例,是否重用已存在的Activity实例,是否和其他Activity实例公用一个task里。这里顺带简单介绍一下task的概念,task也叫活动栈,数据结构是栈,它用来管理Activity,一个task可以管理多个Activity,启动一个应用,也就创建一个与之对应的task。
Activity中共有四种启动模式:
*1.standard
*2.singleTop
*3.singleTask
*4.singleInstance
上述四中启动模式可以在AndroidManifest.xml中通过的android:launchMode属性进行配置
1.standard
该启动模式是系统默认的启动模式,如果你新建一个Activity并且不设置它的启动模式(模式为standard),那么当其他Activity启动这个Activity的时候就会重新创建一个实例,不管之前的task中是否有这个Activity的实例。
比如:A、B、C三个Activity的启动顺序为A->B->C,三者的启动模式均为standard,那么,在C中启动C的时候,,tsak中会重新生成一个新的A的实例,task中的顺序将变为A->B->C1->C2。(C1,C2表示同一Activity的不同实例)
2.singleTop
该启动模式与standard不同之处在于,如果被启动的Activity的启动模式被设置为singleTop的话,如果在task中有该Activity的实例并且该Activity处于栈顶的话,那么系统不会重新创建新的Activity,而是会复用之前的Activity实例,同时回调Activity中的onNewIntent()方法,否则的话系统还是会和与standard一样创建新的实例。比如:A->B->C,C启动模式为singleTop,在C中启动C,由于C在栈顶,task中依旧为A->B->C,如果设置A启动模式为singleTop,那么在C中启动A,A不在栈顶,则系统会重新创建实例,task中会变为A1->B->C->A2。
3.singleTak
singleTask模式和后面的singleInstance模式都是只创建一个实例的。
该启动模式是singleTop的加强版,如果发现所在Activity栈中有对应的Activity实例,则使此Activity实例之上的其他Activity实例统统出栈,使此Activity实例成为栈顶对象,显示到幕前。比如:A->B->C,C启动模式为singleTop,在C中启动C,由于C在栈顶,task中依旧为A->B->C,如果设置A启动模式为singleTop,那么在C中启动B,B不在栈顶,则系统清除B上面的所有实例,让其置于栈顶,task中会变为A->B。
4.singleInstance
这种启动模式比较特殊,因为它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入。
简单点理解,singleInstance所标识的Activity,当被启动时,系统会首先判断系统其他栈中是否已经存在此Activity实例,有则直接使用,并且其所在的Activity栈理论上只有它一个Activity元素。
关于Activity的taskAffinity和Intent的几种常见的FLAG是以及task相关属性会在下一篇文中详细介绍
参考链接:Android之四种加载方式(http://blog.csdn.net/tiancizhenai/article/details/7037787).
网友评论