Android Surface 系统简单学习
####Activity的View 在应用开发的时候,我们需要设置Activity的View,就是Activity视图的部分。而Activity内部的View又究竟是怎样一个结构呢?怎么跟更贴近底层的部分交互的呢?
Activity中有一个Window,具体的实现其实是PhoneWindow对象,那些View其实就是跟这个window关联的。window又跟windowmanager相互关联(其实就是包含了一个LocalWindowManager对象,LocalWindowManager跟WindowManagerImpl都实现了WindowManager,而LocalWindowManager将它的工作委托给WindowManagerImpl去做)
其实PhoneWindow里面又包含了一个DecorView,DecorView里面包含我们使用setContentView设置的View。具体图像如下
phonewindow跟View其实根本就不是一级,WindowManager是用来管理Window的。我们平时使用WindowManager来做FlowView的时候,FlowView跟普通的Activity中的View就不是一样的,WindowManager添加的View级别相对来说更高,因为Activity中使用的View其实是添加在DecorView下面的,而DecorView里面还添加了标题栏。而最后是将decorView添加到WindowManager中的,Activity中setContentView的View与直接用WindowManager添加的View,你可以理解为两个并行独立的。
在Android的源码中,WindowManager是将View添加到一个ViewRoot当中的,这个ViewRoot是什么呢?ViewRoot继承了Handler类。写过基础的应用都知道,Handler类用来进行消息通信的。ViewRoot就是通过HandleMessage的方式来与Surface部分进行消息通信的。ViewRoot在是Activity所在的进程,ViewRoot通过Binder通信与WindowManagerService进行通信。
WindowManagerService由System_Server进程启动,SurfaceFlinger服务也在这个进程中,Activity的显然需要与WindowManagerService建立联系。
ViewRoot通过IWindowSession与WindowManagerService进行跨进程通信。
ViewRoot内部有一个W类型的对象,它也是一个机遇Binder通信的类,W是IWindow的Bn端,用于响应请求。
ViewRoot与WindowManagerService建立连接的目的是这样的,WindowManagerService所在的SystemServer进程接收到按键信息(当然也包括其他的一些信息),WindowManagerService找到UI位于屏幕顶部的进程所对应的IWindow对象,调用这个IWindow对象的dispatchKey,通过跨进程调用,最后调用ViewRoot对应的,真正处理这个事件的View。
Activity的绘制,其实就是在surface上lock一个Canvas,然后在这个Canvas上面绘制。就是这样从ViewRoot到最底层的View,一层一层地绘制,再具体的,都是由各个View自己绘制了(onDraw函数)。
Surface
Surface与RootView通信
ViewRoot有一个Surface的成员变量
private final Surface mSurface = new Surface();
WindowManagerService中也有一个Surface,但是它的初始化是这样的
Surface createSurfaceLocked(){
......
try{
mSurface = new Surface(mSession.mSurfaceSession,mSession.mPid,mAttrs.getTitle().toString(),0,w,h,mAttrs.format,flags);
}
...
Surface.openTransaction();
......
Surface.closeTransaction();
}
两个部分的Surface看似是毫无关系,但是实际上,在使用createSurfaceLocked() 的时候,会将creaeSurfaceLocked 创建的Surface copy到ViewRoot层的Surface中。也就是这样,将底层的Surface对象传到上层,供Activity的界面部分使用,用来绘图。(具体可参看源代码)。整个流程大概是这样的
- RootView.relayoutWindow
- WindowManagerService.Session.relayout
- WindowManagerService.relayoutWindow
- WindowManagerService.createSurfaceLocked()
- outSurface.copyFrom(surface)
最后一步是将WindowManagerService的surface与ViewRoot 的outSurface联系起来的关键点,outSurface是作为参数,从RootView传到WindowManagerService的。在邓凡平的博客中,称之为乾坤大挪移。
ViewRoot其实是通过Binder与WindowManagerService进行跨进程调用通信的。
Surface绘图
Surface中有一个Canvas,Canvas是用于记载画图的动作,Canvas提供了许多画图的动作,想画一个矩形,画一段文字等等。
画图需要了解这么一个函数lockCanvas,lockCanvas获取一块存储区域,然后将它与Canvas绑定在一起,然后UI在Canvas上面的绘画,就直接记录到那块存储区域了。另外lockCanvas也是可以对屏幕中的一部分区域进行绑定,进行绘制。
lock之后,需要unlock,有个unlockCanvasAndPost用来释放。
Surface入门总结
在《深入理解Android》这本书中有段总结挺好的,我截取了部分来总结
- 使用SurfaceControl的writeToParcel将SurfaceControl写入到Parcel中,将其设置到Java层的Surface对象中
- Java层根据Parcel信息包,重新构造一个Surface
- 调用Surface的lock
- UI画图
- 调用Surface的unlockAndPost
SurfaceFlinger
在这里还是使用《深入理解Android》的总结简单介绍
- 调用waitForEvent等待重绘或者事务处理
- 如果有事务处理请求,则调用HandleTransaction进行处理
- 调用handlePageFlip,对各个显示层进行PageFlip。对于Layer类,它会生成一个新的纹理。
- 调用handleRepaint,它会遍历各个显示层的onDraw函数
- 调用unlockClients,遍历各个显示层的finishPageFlip函数
- 调用postFrameBuffer,将混合后的内容投递屏幕
这篇文章是我对《深入理解Android》关于深入理解Surface系统部分的一个简单的总结,以及自己部分的体悟。感觉只看别人写的书,可能是无用的,要自己去看源码,别人写的书只是一个思维方式上的借鉴,真正要深入理解明白,还是要亲躬力行。只有自己的东西,才能够真正地闲手拈来。如果自己不思考,很容易就陷入到别人的思维顺序了,但是这个又并不会一定适合自己。
感觉看这部分对于我来说还是非常吃力,但坚信书读百遍,其义自现。就像啃甘蔗一样,也许牙齿费力点,但是会有甘甜流出。
Android Surface 系统简单学习相关推荐
- 深入浅出 详解Android Surface系统(1)
文章来自:http://mobile.51cto.com/android-259922.htm 本文详细介绍了Android中的Surface系统,采用情景分析的办法,详解了何为SurfaceFlin ...
- 详解Android Surface系统
一 目的 本篇文章的目的就是为了讲清楚Android中的Surface系统,大家耳熟能详的SurfaceFlinger到底是个什么东西,它的工作流程又是怎样的.当然,鉴于SurfaceFlinger的 ...
- 深入浅出 详解Android Surface系统(2)
文章来自:http://mobile.51cto.com/android-259922_1.htm 本文详细介绍了Android中的Surface系统,采用情景分析的办法,详解了何为SurfaceFl ...
- Android Surface系统的概述(一)
一. 本系列文章将集中打通Surface系统的任督二脉 任脉:应用程序和Surface的关系 督脉:Surface和SurfaceFlinger之间的关系. 当这二脉打通后,我们就可以自行修炼更高层次 ...
- 滴滴人工智能调度系统简单学习
腾讯大数据峰会暨 KDD China 技术峰会中,滴滴研究院副院长.密歇根大学终身教授叶杰平博士现场演讲学习.详细见:http://weibo.com/ttarticle/p/show?id=2309 ...
- Android Surface system analyze
CSDN新首页上线啦,邀请你来立即体验! 立即体验 博客 学院 下载 GitChat 更多 prike 深入理解 Android 卷I - 第8章 深入理解Surfac ...
- 深入理解 Android 卷I - 第8章 深入理解Surface系统
原文地址:http://wiki.jikexueyuan.com/project/deep-android-v1/ 第8章 深入理解Surface系统 本章主要内容 · 详细分析一个Activit ...
- Android 系统进阶学习大招来了~
原创PDF |<Android 深入系统完全讲解>,可能价值百万! 辅导预约,安排时间10-11月.一部分内容讲解如何进阶学习,额外会赠送如何寻找项目,进行变现. 万物皆可调试,1v1辅导 ...
- Android 4.1 Surface系统变化说明
时间真的是很巧,本来没打算写Surface系统的(相比AudioFlinger来说,Surface变化之后的难度真的是毛毛雨了),但为了庆祝泷泽萝拉发第二部大作,我决定还是要坚持一下. 下面将延 ...
最新文章
- 发布Web应用程序时发生的“xx.aspx.cs文件不存在”错误
- 前端有啥好用的手机模拟软件吗_隐藏应用,软件双开,一个APP就解决了
- 吴老师用计算机输入一份稿件,分数乘除法易错题复习1.pdf
- java运动员最佳配对_运动员最佳配对问题 - osc_y1pyjby5的个人空间 - OSCHINA - 中文开源技术交流社区...
- servlet乱码问题
- 学点 C 语言(22): 数据类型 - 多维数组与指针
- 安卓颜色标签android
- ACL2021 | 探讨跨句事件联合抽取问题
- JDK8相对于JDK7的一些新特性
- python设置执行服务环境变量_Python执行.sh脚本cataline环境变量配置
- 大一计算机基础考试知识点,大学计算机基础考试知识点(完整版)
- 详解LVDS通信协议
- C#发送邮件,包含发送附件
- 【排序算法】图解冒泡排序(多图+解决两种无效比较问题)
- 中间选民定理(迭代剔除劣势策略,换位思考)
- Postgresql12 安装及设置远程访问
- Archer Materials通过超级计算机确认12CQ材料的独特性
- Non-Interactive Guessing Number
- zookeeper-端口说明
- 【Linux】CentOS7 C#开发环境搭建笔记(Jexus安装、配置、部署)