Activity组件在启动完成后,会通过一个类型为Session的Binder对象来请求WindowManagerService为它创建一个类型为WindowState的对象,用来描述它的窗口状态
Android应用程序会通过一个类型为Client的Binder对象来请求SurfaceFlinger服务为它创建一个类型为Layer的对象,用来描述它的窗口数据。
Activity组件与WindowManagerService服务和SurfaceFlinger服务的交互模型,如图1所示:
一个Activity组件的UI是使用一个PhoneWindow对象来描述的
一个PhoneWindow对象是通过调用PolicyManager类的静态成员函数makeNewWindow来创建的。
PolicyManager类就是通过成员函数makeNewWindow来为一个Activity组件创建一个PhoneWindow对象的。
PhoneWindow类有两个重要的成员变量mDecor和mContentParent,它们的类型分别DecorView和ViewGroup。其中,成员变量mDecor是用描述自己的窗口视图,而成员变量mContentParent用来描述视图内容的父窗口。
DecorView类所描述的应用程序窗口视图是否需要重新绘制是由另外一个类ViewRoot来控制的, ViewRoot类是从Handler类继承下来的。
ViewRoot类在两种情况需要经常应用程序进程的主线程的消息队列发送消息:
第一种情况是当ViewRoot类从系统输入管理器InputManager接收到键盘、触摸屏等输入事件时,它就会把这些输入事件封装成一个消息,并且发送到应用程序进程的主线程的消息队列中去进一步处理,这样就可以保证键盘、触摸屏等输入事件可以在应用程序进程的主线程中进行处理。
第二种情况是当ViewRoot类需要重新绘制与它所关联的一个Activity组件的UI时,它就会将这个绘制UI的操作封装成一个消息,并且发送到应用程序进程的主线程的消息队列中去进一步处理,这样同样可以保证绘制UI的操作可以在应用程序进程的主线程中执行。
- Android应用程序窗口的运行上下文环境的创建过程
运行上下文环境的创建过程,如图2所示:
- Android应用程序窗口对象的创建过程
与Activity组件所关联的一个PhoneWindow对象是从Activity类的成员函数attach中创建的,如图3所示:
Activity组件所关联的应用程序窗口对象的创建过程:
1. 一个Activity组件所关联的应用程序窗口对象的类型为PhoneWindow。
2. 这个类型为PhoneWindow的应用程序窗口是通过一个类型为LocalWindowManager的本地窗口管理器来维护的。
3. 这个类型为LocalWindowManager的本地窗口管理器又是通过一个类型为WindowManagerImpl的窗口管理器来维护应用程序窗口的。
4. 这个类型为PhoneWindow的应用程序窗口内部有一个类型为DecorView的视图对象,这个视图对象才是真正用来描述一个Activity组件的UI的。- 应用程序窗口视图的创建过程
ViewRoot相当于是MVC模型中的Controller,它有以下职责:
1. 负责为应用程序窗口视图创建Surface。
2. 配合WindowManagerService来管理系统的应用程序窗口。
3. 负责管理、布局和渲染应用程序窗口视图的UI。
应用程序窗口的视图对象及其所关联的ViewRoot对象的创建过程:
- Activity组件与WindowManagerService的连接过程
通过三个过程来分析它们彼此之间的连接模型,如下所示:
1. ActivityManagerService服务请求WindowManagerService服务为一个Activity组件创建一个AppWindowToken对象的过程;
2. 应用程序进程请求WindowManagerService服务创建一个Session对象的过程;
3. 应用程序进程请求WindowManagerService服务为一个Activity组件创建一个WindowState对象的过程。
二. Session对象的创建过程
三. WindowState对象的创建过程
- 应用程序窗口的绘图表面的创建过程
位于应用程序进程这一侧的Surface对象负责绘制应用程序窗口的UI,即往应用程序窗口的图形缓冲区填充UI数据,
而位于WindowManagerService服务这一侧的Surface对象负责设置应用程序窗口的属性,例如位置、大小等属性。
应用程序窗口对应有两个Surface对象,创建:
1. 应用程序进程请求WindowManagerService服务为一个应用程序窗口创建一个Surface对象;
2. WindowManagerService服务请求SurfaceFlinger服务创建一个Layer对象,并且获得一个ISurface接口;
3. WindowManagerService服务将获得的ISurface接口保存在其内部的一个Surface对象中,并且将该ISurface接口返回给应用程序进程;
4. 应用程序进程得到WindowManagerService服务返回的ISurface接口之后,再将其封装成其内部的另外一个Surface对象中。
通过Android应用程序窗口的绘图表面的创建过程了解到:
1. 每一个应用程序窗口都对应有两个Java层的Surface对象,其中一个是在WindowManagerService服务这一侧创建的,而另外一个是在应用程序进程这一侧创建的。
2. 在WindowManagerService服务这一侧创建的Java层的Surface对象在C++层关联有一个SurfaceControl对象,用来设置应用窗口的属性,例如,大小和位置等。
3. 在应用程序进程这一侧创建的ava层的Surface对象在C++层关联有一个Surface对象,用来绘制应用程序窗品的UI。
- 分析Android应用程序窗口的测量、布局以及绘制过程
1. Android应用程序窗口的测量过程
2. Android应用程序窗口的布局过程
3. Android应用程序窗口的绘制过程
从中就可以看出:
1. 渲染Android应用程序窗口UI需要经过三步曲:测量、布局、绘制。
2. Android应用程序窗口UI首先是使用Skia图形库API来绘制在一块画布上,实际地是绘制在这块画布里面的一个图形缓冲区中,这个图形缓冲区最终会被交给SurfaceFlinger服务,而SurfaceFlinger服务再使用OpenGL图形库API来将这个图形缓冲区渲染到硬件帧缓冲区中。