task是用户在执行一个特定功能是与之交互的Activity的集合。
下面说一下task相关属性的用法。
1launchMode
这个属性可以再AndroidManifest中配置有以下选项可供选择
standard默认
系统在启动该Activity的task创建一个新的Activity实例,一个activity能被实例化多次,每个实例可以属于不同的task,一个task也能拥有多个实例
singleTop
如果一个Activity实例已经存在并位于当前task的栈顶,系统转发intent到这个Activity实例并调用她的OnNewIntent方法,而不是重新创建一个新的实例。只有在栈顶的元素才不会被重新创建。
singleTask
系统创建一个新的task并且实例化这个activity作为新task的栈底,但是如果这个activity的实例已经存在来一个分离的task中,系统将转发intent到这个实例并且调用它的onNewIntent方法,而不是创建一个新的实例同时只有一个activity的实例存在。
singleInstance
和singleTask一样,但是系统将不会在持有这个activity的task中启动另外一个activity,一个task中只有一个单独的activity实例,任何在这个task中被启动的activity都属于另外一个task.
通过Intent Flag来制定
FLAG_ACTIVITY_NEW_TASK和singleTask功能一样
FLAG_ACTIVITY_SINGLE_TOP和singleTop功能一样
FLAG_ACTIVITY_CLEAR_TOP如果要启动的activity已经运行在当前task中,所有的位于这个Acitivity之上的Activity将被Destory并且Intent会被发到这个Activity的onNewIntent函数中
taskAffinity
每个Activity都有taskAffinity属性,这个属性指出了它希望进入的Task。如果一个Activity没有显式的指明该 Activity的taskAffinity,那么它的这个属性就等于Application指明的taskAffinity,如果 Application也没有指明,那么该taskAffinity的值就等于包名。而Task也有自己的affinity属性,它的值等于它的根 Activity的taskAffinity的值。
第一种情况
当一个Activity的allowTaskReparenting设置为true,当他进入后台,当一个和它有相同affinity的Task进入前台时,它会重新宿主,进入到该前台的task中。
第二种情况。如果加载某个Activity的intent,Flag被设置成FLAG_ACTIVITY_NEW_TASK时,它会首先检查是否存在与自己taskAffinity相同的Task,如果存在,那么它会直接宿主到该Task中,如果不存在则重新创建Task。