fWX228941 / project

all by myself
1 stars 0 forks source link

窗口管理员 WMS #33

Open fWX228941 opened 5 years ago

fWX228941 commented 5 years ago

1.概述 图片11

2.作用 2.1.应用程序的显示请求在surfaceFlinger 和 WMS的协助下有序地输出给物理屏幕和其他显示设备。 2.2.WMS 区别与serfaceFlinger的因素是它还兼职处理对输入事件的派发 图片12

2.3.工作方式: 1)事件传递:WMS属于Systemserver 启动众多系统服务中的一种,运行在自己的主线程中,外界的请求或者事件只要投递到这个线程的队列即可. 2)Handler 与MessageQueue 优先级,不着急的排队处理,着急的立即处理。 3)WMS 虽然是面向系统中所有应用程序服务的,但并非处理来自客户端的任何小请求,WMS 通过IWindowManager.openSession向外界开放一个打开session的接口。 4)ActivityRecord 记录Activity,WindowState 记录保存窗口相关的信息

2.3.窗口属性 1) 图片13

2) 图片14

3)进程向WMS申请一个窗口时,它需要指定所需的窗口类型,除个别特殊情况外,应用程序是不能创建系统窗口的,因为系统会做权限检查。 4)每一个窗口类型是一个值,数字越大的窗口,优先级越高,最后在屏幕上显示时越靠近用户。 5)WindowManagerPolicy 窗口策略 Android 显示系统所遵循的统一的窗口显示规则,针对不同的产品,策略通常是不一样的。 开发商自行定制,某些行为天生更接近于某种产品而已。 6)窗口属性:UI界面显示出不同的样式。窗口用户与WMS之间的协议,WindowManager.LayoutParams

7) 图片16

7)默认情况下,系统是从StatusBar下面的部分开始给应用程序做UI布局的 ,如果是全屏,那么你的View 界面布局从屏幕的(0,0)坐标开始。 8)WindowManager 是WindowManagerImpl的约束协议,WindowManager是一个接口类。继承是一层约束 9)requestLayout 发起layout 请求,WSM除了窗口管理外,还负责各种事件的派发,所以在向WMS注册前应用程序要确保这颗View树已经做好了接收事件的准备。 10)WMS并不关心View树所表达的具体UI内容,它只要知道应用进程各应用进程显示界面的大小。 11)系统窗口类型部分需要相应的权限许可才能使用。 12)当用户启动一个Activity 时,AMS首先判断该Activity所属应用程序进程是否已经运行,如果是就向这个进程发送启动指定Activity的命令,否则先创建该应用进程。运行ActivityThread 主线程。 13)一个activity对应的View 树最外围是DecorView。 图片17

3.Surface 3.1. surfaceFlinger 才是真正将窗口数据合成并最终显示到屏幕上的系统服务,WSM 在队窗口的大小等作出调整的同时,必须通知surfaceFlinger 这样才能把正确结果及时地呈现给观众。 3.2.当窗口的可见性,大小等属性发生变化时,调relayoutWindow. 3.3.配置Activity的AndroidManifest.xml时,可以特别指定输入法窗口出现时,应用程序本身的界面是否要缩小,以腾出相应的位置来容纳输入法键盘。 3.4.状态栏和输入法都会影响应用程序窗口大小的计算。状态栏占据的位置,输入法窗口的表现取决于Activity属性的设置。 图片18

3.5.ViewRootImpl 会在应用程序运行过程中多次调用performTraversals 以计算窗口的大小。