####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的成员变量

  1. private final Surface mSurface = new Surface();

WindowManagerService中也有一个Surface,但是它的初始化是这样的

  1. Surface createSurfaceLocked(){
  2. ......
  3. try{
  4. mSurface = new Surface(mSession.mSurfaceSession,mSession.mPid,mAttrs.getTitle().toString(),0,w,h,mAttrs.format,flags);
  5. }
  6. ...
  7. Surface.openTransaction();
  8. ......
  9. Surface.closeTransaction();
  10. }

两个部分的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》这本书中有段总结挺好的,我截取了部分来总结

  1. 使用SurfaceControl的writeToParcel将SurfaceControl写入到Parcel中,将其设置到Java层的Surface对象中
  2. Java层根据Parcel信息包,重新构造一个Surface
  3. 调用Surface的lock
  4. UI画图
  5. 调用Surface的unlockAndPost

SurfaceFlinger

在这里还是使用《深入理解Android》的总结简单介绍

  1. 调用waitForEvent等待重绘或者事务处理
  2. 如果有事务处理请求,则调用HandleTransaction进行处理
  3. 调用handlePageFlip,对各个显示层进行PageFlip。对于Layer类,它会生成一个新的纹理。
  4. 调用handleRepaint,它会遍历各个显示层的onDraw函数
  5. 调用unlockClients,遍历各个显示层的finishPageFlip函数
  6. 调用postFrameBuffer,将混合后的内容投递屏幕

这篇文章是我对《深入理解Android》关于深入理解Surface系统部分的一个简单的总结,以及自己部分的体悟。感觉只看别人写的书,可能是无用的,要自己去看源码,别人写的书只是一个思维方式上的借鉴,真正要深入理解明白,还是要亲躬力行。只有自己的东西,才能够真正地闲手拈来。如果自己不思考,很容易就陷入到别人的思维顺序了,但是这个又并不会一定适合自己。


感觉看这部分对于我来说还是非常吃力,但坚信书读百遍,其义自现。就像啃甘蔗一样,也许牙齿费力点,但是会有甘甜流出。

Android Surface 系统简单学习相关推荐

  1. 深入浅出 详解Android Surface系统(1)

    文章来自:http://mobile.51cto.com/android-259922.htm 本文详细介绍了Android中的Surface系统,采用情景分析的办法,详解了何为SurfaceFlin ...

  2. 详解Android Surface系统

    一 目的 本篇文章的目的就是为了讲清楚Android中的Surface系统,大家耳熟能详的SurfaceFlinger到底是个什么东西,它的工作流程又是怎样的.当然,鉴于SurfaceFlinger的 ...

  3. 深入浅出 详解Android Surface系统(2)

    文章来自:http://mobile.51cto.com/android-259922_1.htm 本文详细介绍了Android中的Surface系统,采用情景分析的办法,详解了何为SurfaceFl ...

  4. Android Surface系统的概述(一)

    一. 本系列文章将集中打通Surface系统的任督二脉 任脉:应用程序和Surface的关系 督脉:Surface和SurfaceFlinger之间的关系. 当这二脉打通后,我们就可以自行修炼更高层次 ...

  5. 滴滴人工智能调度系统简单学习

    腾讯大数据峰会暨 KDD China 技术峰会中,滴滴研究院副院长.密歇根大学终身教授叶杰平博士现场演讲学习.详细见:http://weibo.com/ttarticle/p/show?id=2309 ...

  6. Android Surface system analyze

    CSDN新首页上线啦,邀请你来立即体验! 立即体验 博客     学院     下载     GitChat     更多 prike 深入理解 Android 卷I - 第8章 深入理解Surfac ...

  7. 深入理解 Android 卷I - 第8章 深入理解Surface系统

    原文地址:http://wiki.jikexueyuan.com/project/deep-android-v1/ 第8章  深入理解Surface系统 本章主要内容 ·  详细分析一个Activit ...

  8. Android 系统进阶学习大招来了~

    原创PDF |<Android 深入系统完全讲解>,可能价值百万! 辅导预约,安排时间10-11月.一部分内容讲解如何进阶学习,额外会赠送如何寻找项目,进行变现. 万物皆可调试,1v1辅导 ...

  9. Android 4.1 Surface系统变化说明

     时间真的是很巧,本来没打算写Surface系统的(相比AudioFlinger来说,Surface变化之后的难度真的是毛毛雨了),但为了庆祝泷泽萝拉发第二部大作,我决定还是要坚持一下. 下面将延 ...

最新文章

  1. 发布Web应用程序时发生的“xx.aspx.cs文件不存在”错误
  2. 前端有啥好用的手机模拟软件吗_隐藏应用,软件双开,一个APP就解决了
  3. 吴老师用计算机输入一份稿件,分数乘除法易错题复习1.pdf
  4. java运动员最佳配对_运动员最佳配对问题 - osc_y1pyjby5的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. servlet乱码问题
  6. 学点 C 语言(22): 数据类型 - 多维数组与指针
  7. 安卓颜色标签android
  8. ACL2021 | 探讨跨句事件联合抽取问题
  9. JDK8相对于JDK7的一些新特性
  10. python设置执行服务环境变量_Python执行.sh脚本cataline环境变量配置
  11. 大一计算机基础考试知识点,大学计算机基础考试知识点(完整版)
  12. 详解LVDS通信协议
  13. C#发送邮件,包含发送附件
  14. 【排序算法】图解冒泡排序(多图+解决两种无效比较问题)
  15. 中间选民定理(迭代剔除劣势策略,换位思考)
  16. Postgresql12 安装及设置远程访问
  17. Archer Materials通过超级计算机确认12CQ材料的独特性
  18. Non-Interactive Guessing Number
  19. zookeeper-端口说明
  20. 【Linux】CentOS7 C#开发环境搭建笔记(Jexus安装、配置、部署)

热门文章

  1. 直击GFE2021展会|火爆人气见证加拓宝品牌实力
  2. 【FFmpeg_SDL_MFC】1、FFMPEG视频解码器
  3. 揭秘:网易运营、产品经理日常工作都在用的14大神器
  4. 计算机无法启动dns,通过更改DNS解决电脑无法打开网页问题
  5. 主流的视频动作类算法任务介绍
  6. 高清晰渲染管线HDRP入门指南
  7. 支持基于角色的权限访问控制,优化UI界面,JumpServer堡垒机v2.20.0发布
  8. U9 自动计划工具操作说明
  9. CSS | 隐藏滚动条,但保持页面依旧能够滚动
  10. AM2 开发日志2 10.17