Task,简单的说,就是一组以栈的模式聚集在一起的Activity组件集合。

   有关Task栈


点开Email应用,进入收件箱(Activity A)    A  

选中一封邮件,点击查看详情(Activity B)    AB  

点击回复,开始写新邮件(Activity C)    ABC  

写了几行字,点击选择联系人,进入选择联系人界面(Activity D)    ABCD  

选择好了联系人,继续写邮件    ABC  

写好邮件,发送完成,回到原始邮件    AB  

点击返回,回到收件箱    A  

退出Email程序    null


 如上表所示,是一个实例。从用户从进入邮箱开始,到回复完成,退出应用整个过程的Task栈变化。这是一个标准的栈模式,对于大部分的状况,这样的Task 模型,足以应付,但是,涉及到实际的性能、开销等问题,就会变得残酷许多。比如,启动一个浏览器,在Android中是一个比较沉重的过程,它需要做很多初始化的工作,并且会有不小的内存开销。但与此同时,用浏览器打开一些内容,又是一般应用都会有的一个需求。设想一下,如果同时有十个运行着的应用(就会对应着是多个Task),都需要启动浏览器,这将是一个多么残酷的场面,十个Task栈都堆积着很雷同的浏览器Activity,是多么华丽的一种浪费啊。于是你会有这样一种设想,浏览器Activity,可不可以作为一个单独的Task而存在(),不管是来自那个Task的请求,浏览器的Task,都不会归并过去。这样,虽然浏览器Activity本身需要维系的状态更多了,但整体的开销将大大的减少,这种舍小家为大家的行为,还是很值得歌颂的

    LaunchMode(启动模式)
  1、标准模式
    1)从task中启动Activity时,该Activity的新实例总是在当前
      task中创建
    2)每次启动Activity,都会创建该Activity类的新实例
    3)一个task中可以存在同一Activity的多个实例
    4)一个Activity的多个实例可以出现在多个task栈中

     2、singleTop
    1)如果启动模式设置为singleTop的Activity实例未处于栈顶,
      则其表现与启动模式设置为standard的Activity的表现一致
    2)如果启动模式设置为singleTop的Activity的实例位于任务栈的栈顶
      则,不会创建该Activity的新实例。只是调用位于栈顶的该Activity
      实例的onNewIntent方法,将新的intent传递给该实例。  
  3、singleTask
    1)设置为singleTask的Activity,具有全局唯一性,在Android系统中
      只能创建该Activity的一个实例。
    2)如果启动模式设置为singleTask的Activity时,已经存在该Activity的
      实例,则将该实例之上的所有Activity实例释放,将该实例重新带回到
      栈顶,并调用器onNewIntent方法,将新的intent传递给该实例
    3)在创建设置为singleTask模式的Activity的实例时,如果当前task的
      taskAffinity与该Activity的taskAffinity一致,则直接在当前task中
      创建;如果当前task的taskAffinity值与该Activity的taskAffinity不一致
      则在新的任务中创建该Activity的实例。
  4、singleInstance
    1)当创建设置为singleInstance模式的Activity时,总是在新的任务中创建
    2)设置为SingleInstance模式的Activity,具有全局唯一性。在Android系统
      中只能存在该Activity的一个实例
    3)设置为singleInstance模式的Activity,总是单独在一个task中存在
      也就是说在该Activity所在的task栈中不可能存在其他的activity