Android中,每个Activity都需要从属于一个Task,这个Task是Android相对于Activity的一个概念,Task是一组相关联的Activity的集合,它存在于一个叫back stack的数据结构中,而framework层调度Activity都是通过管理这个back stack的数据结构来完成的,所以可以就理解为framework层是通过任务栈的形式来管理调度Activity的,所以就直接理解为Task就是一个任务栈就得了。栈的数据结构是先进后出。
任务栈是可以跨应用的,这样就能保证用户操作的连贯性,比如说你在自己的APP的ActivityA中需要调用到邮件软件的一个SendActivity来发送邮件(这里可以通过scheme方式来调用),这两个应用是属于不同App的,被系统放在同一个Task中,当用户用户发完邮件按返回键时,直接返回到ActivityA,这样确保了用户有一个流畅的用户体验。
同一个任务栈中的Activity可以来自不同应用,同一个应用中的Activity也可能存在于不同的任务栈中。
四种启动模式
standard:
启动: 每次启动Activity都会在任务栈中新建一个Activity对象
回退: 点击返回依次在当前任务栈中依据先进后出规则弹栈
singleTop
启动: 这个模式中,例如要启动一个Activity,如果当前所在的任务栈的栈顶中已经有了这个Activity,那么就会直接复用这个Activity(这时生命周期从onNewIntent开始而不是onCreate),如果当前所在任务栈的栈顶不是该Activity,则直接新建一个Activity实例,并且压入栈顶。
回退: 点击返回依次在当前任务栈中依据先进后出规则弹栈
singleTask
启动: 如果在栈中已经有该Activity的实例,就重用该实例(这时生命周期从onNewIntent开始而不是onCreate)。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈(也就是被销毁掉)。如果栈中不存在该实例,framework在启动该Activity时会把它标示为可在一个新任务中启动的状态,至于是否在一个新任务中启动,还要受其他条件的限制(后说)。 正常如果什么其他操作都没做,则将该实例压入任务栈中。
回退: 如果是属于复用了已有的Activity的情况,那么启动时被移出栈的Activity实例就不再展示,因为已经被销毁了。所以整个逻辑也就是点击返回按钮时依次在当前任务栈中依据先进后出的规则弹栈。
singleInstance
启动: 如果一个Activity设置了singleInstance模式,那么当启动这个Activity时,会为该Activity实例新建一个任务栈用于存放该Activity,并且当多次启动Activity时,都是复用的同一个Activity实例,整个新建的任务栈中只会存在一个Activity,也就是设置了singleInstance的那个。
回退: 这种模式下,会产生大于1个的任务栈,则回退的情况是先将展示在前台的Activity所处的任务栈按先入后出的规则弹栈,直到弹完了再依次按启动先后顺序也是按先展示后销毁的规则去弹其他任务栈,直到所有的Activity全部弹出。
(以下红色背景Activity为当前页面展示的Activity)
回退时展示页面为singleInstance模