android艺术探索学习2---Activity4种启动模式以及Flags
一、activity的4中启动模式,包括standard,singleTop,singleTask,singleInstance。
我们启动一个activity,系统会创建一个activity的实例并把实例放到一个任务栈中;启动多个activity,系统就会创建多个activity实例并把他们一一放入到任务栈中,这时,如果我们按返回键,系统就会把任务栈中最上面的一个activity取出,没按一次会取出一个(取出的顺序和放入的顺序刚好是相反的,比如放入的顺序是ABCD,则取出的顺序就是DCBA,这个就是栈结构“先进后出”的栈特性),当任务栈中所有activity都被取出,系统就会回收这个任务栈。
如果我们使用系统默认的启动方式,一直让一个activity不停的多次启动自己。然后我们按返回键,就会出现每次按返回键,出现的都是同一个activity,知道任务栈中的所有activity被释放完。这种对一般的应用来说算是一个bug,会造成不怎么好的客户体验,所有Android提供了其他的几种启动模式,可以通过设置启动模式来修改这个默认行为。
1. 设置activity启动模式的方法:
在Manifest.xml中的对应的activity中增加android:lauchMode=“standard”,修改“standard”的值就可以修改activity的启动模式。
2. 四种启动模式的特点:
lauchMode值 | 启动模式 | 特点 |
---|---|---|
standard | 标准模式 | 启动一个activity,不管任务中有没有实例,都会创建一个activity实例,并将这个实例放到任务栈中。 |
singleTop | 栈顶复用模式 | 启动一个activity时,如果这个activity的实例已经在任务栈的顶部,则不会创建一个新的实例,比如,A启动A,这个时候任务栈中只会有A的实例;如果栈内没有这个实例,则会创建一个新的实例,并将这个实例放到栈顶。 |
singleTask | 栈内复用模式 | 启动一个应用会创建一个对应的任务栈来防止activity,activity也可以自己指定一个存放自己的任务栈,通过在manifest中设置 taskAffinity的值即可。这种启动模式有几种情况:
|
singleInstance | 单实例模式 | 此模式是一个增强的singleTask模式,设置了此模式的activity,会自动创建一个新的的任务栈来存放实例。其它特性和singleTask一致。 |
3.taskAffinity的使用:应用启动时会默认创建一个名称是包名的任务栈,管理存放所以未指定任务栈的activity。从启动模式中可以看出,activity可以自己指定自己存放的任务栈,就是通过taskAffinity来设置任务栈的名称。taskAffinity主要是和singleTask以及allowTaskReparenting两个属性配合使用,其它的属性无意义。taskAffinity的名称也必须是包名的形式,要不然也会报错;设置了taskAffinity,必须设置singleTask或者allowTaskReparenting两个属性的值,要不然,启动activity会报错。
二、activity的Flags
activity的flag是有很多种,这里只介绍几个常用的。
- FLAG_ACTIVITY_NEW_TASK:这个标记位的作用是为activity指定“singleTask”启动模式;
- FLAG_ACTIVITY_SINGLE_TOP:这个标记位的作用是为activity指定“singleTop”启动模式;
- FLAG_ACTIVITY_CLEAR_TOP:这个标记位的作用是启动带有此标记位的activity时,会把装有此activity任务栈中activity实例以上的activity都出栈;