目录

知识点整理篇(二):Android中的任务栈Task与Activity启动模式的纠缠

http://image.catbro.cn/upload_88e168a529af9a66cde8d01ac0341391.png


一、前沿:
  • Android 中谈到启动模式,就离不开任务栈Task。
  • Android中对Activty存储的管理与Task息息相关,以下为个人对Task与启动模式的小结。

二、Task
  • 谈到Activity的启动模式,就会涉及到数据结构中的栈,Android中的任务栈也称Task,使用栈结构进行实现,具有后进先出的特点,创建一个Activity时,会往Task中压入一个Actiivty,当Activity销毁时,又会从Task中将该Activity移除,Task顶部的Activity即为此时处于可交互状态的Activity(running状态)
  • 一个Task中可以存储多个app的Activity,一个App的Activity也可以存储在不同的Task中
1、 taskAffinity
  • 除了launchMode可以用来调配Task,的另一属性taskAffinity,也是常常被使用。taskAffinity,是一种物以类聚的思想,它倾向于将taskAffinity属性相同的Activity,扔进同一个Task中。
  • TaskAffinity特点如下:
    • 1、TaskAffinity参数标识着Activity所需要任务栈的名称,默认情况下,一个应用中所有的Activity所需要的任务栈名称都为改应用的包名。
    • 2、taskAffinity的约束力弱于launchMode,只有当中的allowTaskReparen ting设置为true,抑或是调用方将Intent的flag添加FLAG_ACTIVITY_NEW_TASK属性时才会生效,在其他情况下没有实际意义
    • 3、TaskAffinity属性的值不能与当前应用包名相同,否则其值跟没有差不多

三、清除Task的三种模式
1、android:clearTaskOnLaunch
  • 这个属性用来标记是否从task清除除根Activity之外的所有的Activity,“true”表示清除,“false”表示不清除,默认为“false”。
  • 这里有点我们必须要注意的,这个属性只对任务栈内的root Activity起作用,任务栈内其他的Activity都会被忽略。
  • 如果android:clearTaskOnLaunch属性为“true”,每次我们重新进入这个应用时,我们只会看到根Activity,任务栈中的其他Activity都会被清除出栈。
2、android:finishOnTaskLaunch
  • finishOnTaskLaunch属性与clearTaskOnLaunch 有些类似,它们的区别是finishOnTaskLaunch是作用在自己身上(把自己移除任务栈,不影响别的Activity),而clearTaskOnLaunch则是作用在别人身上(把别的Activity移除任务栈)
  • 如果我们把Activity的android:finishOnTaskLaunch属性值设置为true时,离开这个Activity所依赖的任务栈后,当我们重新返回时,该Activity将会被finish掉,而且其他Activity不会受到影响。
3、android:alwaysRetainTaskState
  • 如果当前Activity的android:alwaysRetainTaskState设置为true时,那么该Activity所在的任务栈将不会受到任何清理命令的影响,一直保持当前任务栈的状态。

四、Activity的四种启动模式
1、standard(默认):标准模式
  • 每次启动一个Activity,都会创建一个新的Activity压入Task中
2、singleTop:栈顶复用模式
  • 如果新启动的activity已经存在有对应类型的实例且处于栈顶,系统此时不会创建新的Activity,而是复用栈顶的activity实例,我们如何判断是被复用的呢?
  • 当被复用时,onNewIntent方法将会被回调。onCreate、onStart不会回调,因为我们的Activity已经时被创建并且启动了的,但是onResume还是会回调的哦
3、singleTask:栈内复用模式
  • 该模式为Task栈内单例模式,task内该activity实例只会存在一个
  • 当启动的activity恰好处于top时,行为与singleTop一样
  • 当启动activity,但此时该类型的Activity实例并不处于top,此时会将该activity实例顶部的activitys都从task中移除,然后将该activity置于top
  • 复用时同样会回调onNewIntent
4、singleInstance:单Task单例模式
  • 此模式下,系统将为该模式的Activity创建一个单独的Task,并且该Activity独享该Task
五、总结
  • 从上面的小结中我们可以看出,Android的四种启动模式的特充分利用了Task本身的特点,理解Task的工作方式更有利于我们理解Android的四种启动模式