对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不再存在,应用程序也结束了运行.
共五种:
- HOME_STACK_ID
Home应用以及recents app所在的栈 - FULLSCREEN_WORKSPACE_STACK_ID
一般应用所在的栈 - FREEFORM_WORKSPACE_STACK_ID
类似桌面操作系统 - DOCKED_STACK_ID
- 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 属性配对使用,在其他情况下没有意义。
<activity android:name="com.example.myapplication.Activity1"/>
<activity android:name="com.example.myapplication.Activity2"
android:launchMode="singleTask"
android:taskAffinity="com.example.t2"/>
上面这个例子中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启动的很多逻辑
未完待续。。
网友评论