AMS中Activity栈相关概念

对Android开发,Activity栈是很重要的概念,在AMS中任务栈用了很多抽象来描述,这里简单学习下。

ActivityStack、TaskRecord、 ActivityRecord
这三个都是AMS中Activity 栈相关的模型,

ActivityStack

为了让这许多Activity协同工作而不至于产生混乱,Android平台设计了ActivityStack机制用于管理Activity,其遵循先进后出的原则,系统总是显示位于栈顶的Activity,从逻辑上将,位于栈顶的Activity也就是最后打开的Activity, 这也是符合逻辑的。
在操作应用程序时,每次启动新的Activity,都会将此压入Activity Stack,当用户执行返回操作时,移除Activity Stack顶上的Activity,这样就实现了返回上一个Activty的功能。直到用户一直返回到Home Screen,这时候可以理解为移除了Activity Stack所有的Activity,这个Activity Stack不再存在,应用程序也结束了运行.

共五种:

  1. HOME_STACK_ID
    Home应用以及recents app所在的栈
  2. FULLSCREEN_WORKSPACE_STACK_ID
    一般应用所在的栈
  3. FREEFORM_WORKSPACE_STACK_ID
    类似桌面操作系统
  4. DOCKED_STACK_ID
  5. PINNED_STACK_ID
    画中画栈

TaskRecord

task是指将相关的Activity组合到一起,以Activity Stack的方式进行管理。大部分场景上,一个“应用程序”就是一个Task,但其实,一个Task是可以有一个或多个Android Application组成的,一个应用也可以有多个task。而TaskRecord就是在ams中task的描述类
taskAffinity:
可以翻译为任务相关性。这个参数标识了一个 Activity 所需要的任务栈的名字,默认情况下,所有 Activity 所需的任务栈的名字为应用的包名,当 Activity 设置了 taskAffinity 属性,那么这个 Activity 在被创建时就会运行在和 taskAffinity 名字相同的任务栈中,如果没有,则新建 taskAffinity 指定的任务栈,并将 Activity 放入该栈中。另外,taskAffinity 属性主要和 singleTask 或者 allowTaskReparenting 属性配对使用,在其他情况下没有意义。

        
        

上面这个例子中Activity1打开Activity2会在两个task里,而去掉Activity2的singletask或taskaffinity就还是会在一个task里

ActivityRecord

ams中activity的描述类,包含了activity在manifest中的这个配置、在系统中的状态等。
简单来说在ams里,一个ActivityStack管理TaskRecord,而每个TaskRecord又管理了多个ActivityRecord,当然由于AMS及其复杂,ActivityStack中也有很多地方直接操作ActivityRecord

AMS中其他Activity相关类

ActivityDisplay
描述Display的类,简单的说Display可以看做物理屏幕的一个抽象,ActivityStack也是归属于ActivityDisplay的
ActivityStackSupervisor
顾名思义,就是ActivityStack的管理者,AMS中对ActivityStack、TaskRecord、ActivityRecord的操作主要由其负责
ActivityStarter
负责了Activity启动的很多逻辑

未完待续。。

你可能感兴趣的:(AMS中Activity栈相关概念)