1、检查权限mPolice.checkAddPermission(attrs,appOP);//PhoneWindowManager
2、获取或者创建DisplayContent,Activity启动的过程中会创建,但是如果等不及这里先创建。后期WMS所有的appToken由其统一管理,旧版本mTokenMap存在这个类中。
3、mRoot RootWindowContainer,在构造函数中实例化,继承自WindowContainer,开机就被实例化,作为设备的根窗口容器。DisplayContent同样继承自WindowContainer。
每一个DisplayContent实例化的时候都会在其构造函数中调用mRoot.addChild,因此可以推断所有的displaycontent都由mRoot管理。
4、开机SystemServer首先创建ActivityTaskManagerService(atm)旧版本无此类,但是由于后期AMS任务越来越繁重分化出此类,辅助其完成很多任务,并且这个类归到wm包下,主要完成与WMS相关的一些工作。然后创建ActivityManagerService(AMS)并将atm通过startService函数传到类中,SystemServer再去创建DisplayManangerService(DMS),然后创建WindowManagerService(WMS)。当这些类被实例化以后就可以通过AMS的setWindowManager函数去初始化窗口。
这里需要提到几个比较重要的container,其中在AMS startService过程中,会通过构造函数然后去调用atm的initialize函数通过这个函数然后创建了一个RootActivityContainer其名称为mRootActivityContainer这个属性隶属于atm,从这个名称可以看出这是一个根Activity容器类,众所周知安卓是通过Activity来管理所有的窗口的,然后这里又是一个根容器,所以根在这里后续的延续肯定离不开这个实例。这个类直接继承自ConfigurationContainer。后面我们讲的几个container全部都继承自这个类,这是一个抽象类里面定义的都是一些窗口相关的属性,一些矩形信息边界显示配置窗口模式等。总之可以将其归为一个窗口容器配置抽象类,后面所有显示相关的都要继承此类。接下来我们要提到的是RootWindowContainer,这个类是在WMS构造函数中直接实例化的,通过这个名字可以看出它是所有WindowContainer的根容器。mRootWindowContainer隶属于WMS,这俩后续相辅相成,完成Activity与Window的管理。
回到setWindowManager函数它直接调用了atm的setWindowManager,后去调用了mRootActivityContainer的setWindowManager,其实atm还调用了mLockTaskController和mStackSupervisor的这个函数。这个过程把wms传递给了这几个类。让他们拥有对窗口服务的操作权限。回到mRootActivityContainer,它在setWindowManager的过程中回获取到DMS这个服务,去拿到物理显示屏信息。然后通过这些信息去创建ActivityDisplay。