ActivityStack: 实现对ActivityRecord 的管理,对ActivityRecord的管理,实际上就是对Activity的管理。
所有对ActivityRecord的调度操作都在ActivityStack里进行。其实Android里所谓的“Activity堆栈”,并不是真正的一个堆栈结构,而是一个ArrayList列表,在这个列表里记录了所有的ActivityRecord,ActivityStack所做的事情就是保证列表的第一个ActivityRecord(也就是“栈顶”)处于运行状态,并且排在列表后面的ActivityRecord的运行状态受到“栈顶”ActivityRecord的影响。
ActivityRecord:代表了一个Client端的Activity,记录了Activity的各种属性和管理状态。其中有介个关键的成员变量:
IApplicationToken.StubappToken
appToken作为此ActivityRecord的唯一标识,贯穿了AMS、Activity和WMS。
TaskRecord
task标识了此ActivityRecord所属的Task。在ActivityStack对ActivityRecord的位置调整中,更多的是以TaskRecord为单位进行的。如moveTaskToFront()、moveTaskToBack()等接口,会同时移动属于同一个Task的所有activity。 TaskRecord和ActivityRecord是一对多的关系,多个ActivityRecord可能指向同一个TaskRecord
ProcessRecordapp
app标识了Client端的Activity所在的进程。同样的,ProcessRecord和ActivityRecord是一对多的关系,多个ActivityRecord可能指向同一个ProcessRecord。通过访问ProcessRecord中的IApplicationThread可以直接操作Client端的ActivityThread。
TaskRecord记录了task的id、名称等属性。
我们知道,Activity的管理是以Task为单位来进行的,多个行为类似的Activity会被归类到同一个Task中。一般来说,一个apk中的所有Activity都是属于同一个Task,并且Task以apk的包名来命名。但开发者可以在AndroidManifset.xml中通过android:taskAffinity属性给每个Activity配置不同的Task。而什么时候会新开一个Task,新开Task的名字等由ActivityStack里面的逻辑来判断,具体取决于AndroidManifest.xml中的配置和调用startActivity()时传递的flag。