什么是task
简单说task就是一些相关联的activity的集合,但activity之间不一定非得相关联。当我们按home键旁边那个方形键(recent-apps)时,屏幕上展示的就是一个个task。
task affinity
在manifest文件中,注册activity时如果不申明taskaffinity属性,默认就是app程序默认package名。默认情况下一个app中所有的activity都在一个task中。
<activity
android:taskAffinity=""
..
/>
默认情况下的affinity是app的包名
<manifest package="com.example"...>
launch modes
用来指示android系统用怎样的方式来启动activity
有俩种方式来定义launchMode:
在manifest中定义
使用Intent Flags
在manifest文件中定义
<activity android:launchMode = [“standard” | “singleTop” | “singleTask” | “singleInstance”] ../>
standard
默认的启动模式,入栈出栈操作。每一次创建一个新的activity
singletop
和standard和相似,但是有一点不同--系统会检查task栈,查看要启动的activity是否在栈顶,如果要启动的activity在栈顶,那么系统不会新创建要启动activity的实例,而是调用要启动activity的onNewIntent()方法
![](https://img.haomeiwen.com/i7465110/4d3817f9baa28b09.png)
singleTask
当一个activity注册时,必须要定义taskAffinity值,不然就算launchMode为singleTask,它被启动时,仍然不会新建一个task,而是在以前的task中启动。
我们能在该activity所处的栈中push其他activity的实例和其它task栈
singleInstance
和singleTask很相似,只有一个细微的差别---当一个activity的启动模式被定义为singleInstance时,在该activity所处的task栈中,不能push其他activity实例,也不能push其它task栈
当我们根据launchMOde启动一个activity时,android系统会查看taskAffinity的值。查看root activity是否有一样的taskAffinity值,如果taskAffnity值一样的,那么该activity被压入root Activity所在的task栈,如果不是,那么该activity就会压入一个全新的task栈。
使用intent flags来启动
FLAG_ACTIVITY_NEW_TASK 同launchMode中的singleTask
FLAG_ACTIVITY_SINGLE_TOP singleTop
FLAG_ACTIVITY_CLEAR_TOP 分俩种情况
1)所有的activity都在一个task中
这个flag会让系统清除要启动activity之上的activity,并让要启动的activity回到前台
2)activities在不同的task中
包含要启动的activity的task会被系统带回前台,并将要启动activity之上的activities清除。
如果该篇文章有任何问题,希望您能在百忙之中指出并联系我nanhuaqq@gmail.com
网友评论