task是什么?
task的作用?
task与stack的关系?
task什么时候创建?
task是一组Activity实例的集合,这些实例是为了完成了一项特定的操作,按被激活的先后顺序存放在
一个与Task相对应的Stack中,这些实例可以是一个属于一个application的,也一个属于不同的的application的
,比如在写短信添加联系人时需要打开通讯录的里面的Activity,而从写短信到添加联系人再到后面的发送,
这一串的动作都是属于一个task。
android的提供task机制是为了提高用户体验,比如写短信时添加联系人,写短信是属于sms application,
而添加联系人列表是属于contacts application的,虽然是属于两个不同的application,但用户添加完联系人后
又回到写短信的界面,感觉就像一个application,用起来非常的流畅,这就是task的功劳。
当我们在homescreen中点击一个icon启动一个application时(此处假定此application在后台没有运行),
第一个启动的Activity会创建一个Task,每个Activity都会有一个affinity属性,来指定此Activity是属于哪个task,
默认的情况下一个application中的Activity的affinity属性都是相同的,即一个application中activity是属于同一个task的,
但这只是默认的情况,如果在Activity在AndroidManifest.xml注册时,添加属性
android:taskAffinity="com.android.xxx" //此处的属性名不能与activity所在的包相同 android:allowTaskReparenting="true"
当Activity在被激活时,会另外创建一个Task,即一个application可以对应有多个task。虽然是新建了一个Task,
但是在按返回键时,还是会回到之前的activity,看google官方注解:
Note: Although the activity starts in a new task, theBack button still returns the user to the previous activity.
以下的两种Activity启动模式也会创建Task:
singleTask:这是Activity的单任务启动模式,即当Activity被激活时,会先判断是否有实例已存在已有的task中,
如没有实例,则新建一个Task,Activity在此task中启动;如已有实例存在了,则把实例所在的Task作为一个整体
从后台移到前台,见下图:
这里有两种情况:一个是要被激活的Activity实例在Task所对应的栈的栈顶;二是被激活的Activity实例不在task的
所对应栈的栈顶,此时就把此实例推到栈顶,在此实例上面的实例都会被推出栈而注销掉
singleInstance: 这是Activity单实例启动模式, 即第一次创建该实例的时候,会创建一个专属改实例的task,
此task中没会有其他的实例,如果此task处于后台,再激活此Activity时,就会复用该实例,
不会创建新实例和新task。