Android 10 WindowManagerService addWindow分析

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值