《老罗的Android之旅》阅读笔记——应用程序窗口实现框架

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对象的过程。


       一. AppWindowToken对象的创建过程

       二. 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来将这个图形缓冲区渲染到硬件帧缓冲区中。



1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信6博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信6博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值