task
启动一个新应用,系统就会为之创建一个task(因为不同应用的affinity是不一样的,默认是包名),来放置根Activity;
默认情况下,一个Activity启动另一个Activity时,两个Activity是放置在同一个task中的,后者被压入前者所在的task栈,当用户按下后退键,后者从task被弹出,前者又显示在幕前,特别是启动其他应用中的Activity时,两个Activity对用户来说就好像是属于同一个应用;
系统task和task之间是互相独立的,当我们运行一个应用时,按下Home键回到主屏,启动另一个应用,这个过程中,之前的task被转移到后台,新的task被转移到前台,其根Activity也会显示到幕前,过了一会之后,在此按下Home键回到主屏,再选择之前的应用,之前的task会被转移到前台,系统仍然保留着task内的所有Activity实例,而那个新的task会被转移到后台,如果这时用户再做后退等动作,就是针对该task内部进行操作了。
affinity
拥有相同affinity的多个Activity理论同属于一个task。
默认情况下,一个应用内的所有Activity都具有相同的affinity,默认的affinity是中的包名,我们可以为设置taskAffinity属性值,这样可以应用到下的所有,也可以单独为某个Activity设置taskAffinity。
Activity 四种启动模式 
 1. standard-默认模式 
 每次启动一个Activity都会重写创建一个新的实例 
 2. singleTop-栈顶复用模式 
 如果新的activity已经位于栈顶,那么这个Activity不会被重写创建,同时它的onNewIntent方法会被调用。 
注意:standard和singleTop启动模式都是在原任务栈中新建Activity实例,不会启动新的Task,即使你指定了taskAffinity属性。 
 3. singleTask-栈内复用模式 
 如果栈中存在这个Activity的实例就会复用这个Activity,不管它是否位于栈顶,复用时,会将它上面的Activity全部出栈,并且会回调该实例的onNewIntent方法。 
 4. singleInstance-全局唯一模式 
 以singleInstance模式启动的Activity在整个系统中是单例的Intent几种常见的flags 
1. FLAG_ACTIVITY_NEW_TASK 
 目标Activity运行在自己的task中。表示使用一个新的Task来启动一个Activity。 
2. FLAG_ACTIVITY_CLEAR_TOP 
 假设目标Activity为B,如果B是standard模式,task中存在B的实例,则清空B实例上面的Activity(包含B自己),并创建一个新B实例添加到task顶。如果B不是standard模式,task中存在B的实例,则清空B实例上面的Activity把B实例显示在task顶。 
 与在清单文件指定android:launchMode=”singleTask”效果相同。 
3. FLAG_ACTIVITY_SINGLE_TOP 
 当task中存在目标Activity实例并且位于栈的顶端时,不再创建一个新的,直接利用这个实例。 
 与在清单文件指定android:launchMode=”singleTop”效果相同。 
4. FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET 
 被废弃,使用FLAG_ACTIVITY_NEW_DOCUMENT 代替。 
 退居后台之后再次在桌面点击应用,使用该标记的Activity不会显示,但还在Task中。如果在任务历史中点击该应用还是会显示有标记的Activity。对于一个处于后台的应用,如果在主选单点击应用,这个动作中含有FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记,长按Home键,然后点击最近记录,这个动作不含FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记 
5. FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 
 - 启动Activity时创建新的task来放置Activity实例; 
 - 已存在的task被放置于前台。系统会根据affinity对指定的task进行重置操作,task会压入某些Activity实例或移除某些Activity实例。6. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 
 具有此标记位的Activity不会出如今历史Activity的列表中 
7.FLAG_ACTIVITY_NO_HISTORY 
 当该Activity启动其他Activity后,该Activity就被销毁了,不会保留在任务栈中。如A-B,B中以这种模式启动C,C再启动D,则任务栈只有ABD。<activity>的task相关属性 
1. android:allowTaskReparenting 
 B使用standard模式,B被A应用(affinity不一样)调用B的Activity进入A的task中,当在A退居后台,B被调用的Activity会回到B的task中,启动B显示的是被调用的Activity,打开A应用显示的是根Activity。 
2. android:alwaysRetainTaskState 
 用来标记应用的task是否保持原来的状态,此属性只对task的根Activity起作用 
3. android:clearTaskOnLaunch 
 用来标记是否从task清除除根Activity之外的所有的Activity,也只对根Activity起作用。如果设置了这个属性为“true”,每次用户重新启动这个应用时,都只会看到根Activity,task中的其他Activity都会被清除出栈。 
4. android:finishOnTaskLaunch 
 这个属性和android:allowReparenting属性相似,不同之处在于allowReparenting属性是重新宿主到有共同affinity的task中,而finishOnTaskLaunch属性是销毁实例。即被其他应用调用过后退居后台再次进入直接销毁。如果这个属性和android:allowReparenting都设定为“true”,则这个属性胜出。 
5. android:excludeFromRecents=”true” 
 具有此标记位的Activity不会出如今历史Activity的列表中