一. 为什么会有AMS
对于Android app开发人员来说,Activity是其打交道最多的组件了:App的每一个界面都对应于一个Activity。每个Activity都有他的生命周期(那几个生命周期应该已经烂熟于心了吧),所以我们应该有一种机制来记录并管理这些Activity的状态信息,从而根据这些信息,来对App的内存进行分配回收等管理操作。综上,掌握好AMS的工作原理,可以较好地理解Activity组件的状态信息,从而了解到app所处的状态:这对于App开发人员,当然也包括Android系统开发人员是十分必要的。
AMS主要职责:记录并管理Activity(以及其他组件)的状态(不包括内容显示等),同时可以提供查询功能。
二. Activity Stack
前面说到了AMS主要负责记录并管理Activity(或其他组件)的状态,具体的实现是在ActivityStack类中。首先该类通过枚举类型定义了Activity所有可能经历的状态,如下:
enum ActivityState{
INITIALIZING,
RESUMED,
PAUSING,
PAUSED,
STOPPING,
STOPPED,
FINISHING,
DESTROYING,
DESTROYED
}
有了这些状态后,AMS又是如何记录Activity等的状态的呢?ActivityStack类利用了Java中封装比较好的集合工具:这里是利用了多个ArrayList,其中的元素都是ActivityRecord类型。ActivityRecord类负责记录每个Activity的运行时信息。
ActivityState,ArrayList<ActivityRecord>,ActivityRecord构成了ActivityStack的主要框架。他主要通过这三种变量来记录并管理Activity等组件的状态信息。
另外,需要注意的是,ActivityManagerService其实只是一个线程,他寄生于SystemServer进程。(我在其他地方已经说过了,这里小小地回顾下)Android系统在启动时,有三类最重要的系统进程要启动:ServiceManager,Zygote(启动过程中会启动DVM虚拟机,并会启动SystemServer进程)和SystemServer(提供本地服务进程以及Java语言编写的众多系统服务)。其中,SystemServer启动后会同时启动一些重要的系统服务,如AMS,WMS等。在这个阶段,AMS就这样寄生于SystemServer启动了。同时,SystemServer会启动两类系统服务:本地服务,Java层服务。本地层服务包括:SurfaceFlinger,AudioFlinger等,Java层服务包括:AMS,WMS等。
三. Activity Task