好久没有更新技术文了,年后一直忙于其他事情,空闲时间,就在反思,规划,谈一些人生感悟。今天终于提起笔来,继续在代码的世界里,埋头耕耘。
今日我来进行一个分享大会,主要分享的是view 窗口相关的流程讲解,相信下面的链接,会帮你建立起来完备的知识体系。
当然了,在此之前,我先来概括性的进行下描述,如有描述不当之处,欢迎留言交流。
TextView Button ImageViewView 完成内容的展示,同时处理一些输入事件,加入逻辑,可以产生动画等一系列其他行为。View 既然有多个,那么在使用的过程中就会有重叠,有管理,于是就出现了一些 LinearLayout RelativeLayout FrameLayout。
我们 android 上面来讲,activity 用来展示界面的,于是这些FrameLayout 布局,则需要在 activity 里面进行管理,于是就有了一个总的 View,叫做 DecorView(PhoneWindow.java),在 PhoneWindow里面存在。我们系统中的 WindowManager 需要管理窗口,activity 这边产生DecorView,于是需要一个桥梁,这里便出现了 ViewRootImpl(ViewRootImpl.java),当我们启动一个 activity(ActivityThread.java 的 handleResumeActivity)的时候,在windowmanager 的 relayout 时候会进行 addView(WindowManagerGlobal.java 这里会 new ViewRootImpl)于是乎ViewRootImpl 就接管了我们的 View而消息的传递,是基于 WindowManager 管理存储的 list,通过这个列表,里面存储所有的窗口,这些窗口,根据显示顺序,进行排序,系统会进行检测,需要将按键,触摸,传递到当前 focusWindow 上面,而这个 Window 的回调,会在 ViewRootImpl 里面实现WindowInputEventReceiver 的 onInputEvent 方法(ViewRootImpl.java),来接收处理外部事件。
每一个窗体,在 WindowManager 里面,都存在一个 WindowState,这个信息,作为 system_server 里面的桥梁,同时和 AMS 搭配,在系统里面进行逻辑管理。同时,WindowState 里面的信息,要最终出现在屏幕上,则需要屏幕驱动,android 上面使用 gralloc 分配 framebuffer(这个是将硬件直接 mmap 进入内存空间,可以直接操作,直接会体现在屏幕上)gralloc 分配,需要将多个窗口管理起来,进行交互通信,android使用了 surfaceflinger,将上层的窗口,对应到这里的每个 Layer,同时 Java 层的窗体,会有个对应的本地窗口,这里便是 Surface,surface 是存在一个绘制内存,代表一个绘制表面,我们在 TextView等这些 View 的 ondraw 里面,都会发现protected voidonDraw(Canvas canvas) ,这里传入的是 canvas,这个封装默认使用的是 skia 2d 引擎。
同时,当我们使用特殊 View 的时候,比如 surfaceViewGLsurfaceView 以及 TextureView,这些 View 特殊在于,他们是自己主动去直接申请的本地 surface,直接跟普通 View 分离,不使用默认 activity 在调用绘制时,带入的 canvas,而是自己独立的surface,经常这个获取到的 surface 本地绘制表面,会被 egl 方式进行包装,从而可以使用 opengl es 的方法,来进行绘制,使用硬件加速,达到提高绘制效率。
以上是我的一个简单总结概括,有可能描述的不精准,不详细,那么,相信如下的链接,会帮你在每个层面上,进行深度学习,成长。
Android surfaceflinger学习笔记之framebuffer管理http://blog.csdn.net/plato_f/article/details/23198051
FrameBuffer的发展历史https://www.cnblogs.com/armlinux/archive/2012/02/25/2396760.htmlAndroid display架构分析-SW架构分析(1-8)
http://blog.csdn.net/zirconsdu/article/details/8810038
android gralloc 流程分析http://blog.csdn.net/g_salamander/article/details/8424334
RenderThread学习笔记
Android Opengl ES 创建流程
http://blog.sina.com.cn/s/blog_4119bd830100rq3f.html
https://m.2cto.com/kf/201412/361281.html
Android 5.0(Lollipop)事件输入系统(Input System)
Android 应用层 View 绘制流程与源码分析http://blog.csdn.net/lewif/article/category/6070985
android graphic
Android 入门之把窗口信息传递给 InputDispatcher
android 4.4 窗口管理机制
http://wiki.jikexueyuan.com/project/deep-android-v1/surface.html
深入理解 Surface 系统
http://blog.sina.com.cn/s/blog_4119bd830100rq3f.html
Android N 中 UI 硬件渲染(hwui)的 HWUI_NEW_OPS(基于 Android 7.1)
愿此明灯,照亮你的前程。
领取专属 10元无门槛券
私享最新 技术干货