Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >剖析Activity、Window、ViewRootImpl和View之间的关系

剖析Activity、Window、ViewRootImpl和View之间的关系

作者头像
用户1269200
发布于 2018-02-01 07:11:19
发布于 2018-02-01 07:11:19
1.7K0
举报
文章被收录于专栏:刘望舒刘望舒

作者 | 豆沙包67

地址 | https://www.jianshu.com/p/a7596afb1aa1

声明 | 本文是 豆沙包67 原创,已获授权发布,未经原作者允许请勿转载

概念定义

ContextImpl:Context实现类。

PhoneWindow:Window唯一实现类。Window是一个抽象概念,是添加到WindowManager的根容器

ViewRootImpl:ViewRootImpl是View的根,它控制了View的测量和绘制,同时持有WindowSession通过Binder与WMS通信,同时持有IWindow作为WSM的回调接口,用于例如touch事件的回调。

例如touch事件的回调。

WindowManagerImpl:WindowManager和ViewManager的实现类,通过WindowManagerGlobal与WMS通信。

DecorView:继承FrameLayout,是视图树的根布局。

使用AS自带的tools/layout inspector可以看出,整个DecorView包含了三部分:navigationBarBackground为导航栏,statusBarBackground为状态栏,LinearLayout为当中内容部分,展开LinearLayout.FrameLayout,可以得到action_bar_container即actionbar或toolbar和content(R.id.content)即真正setContentView的目标。

下文中但凡遇到抽象类/接口,都用实现类替代,而 -> 符号代表由函数跳转到另一函数。

从启动Activity说起

第一个部分是启动Activity到创建出ViewRootImpl。

从ContextImpl开始,省略掉AMS里相关跳转到最后ActivityThread.performLaunchActivity -> Activity.attach中创建出PhoneWindow。

继续下一步调用方法 ActivityThread.handleResumeActivity -> WindowManagerImpl.addView创建出ViewRootImpl。

ViewRootImpl的构造方法内创建了WindowSession(Binder),通过它与WindowManagerService进行通信。

小结:启动Activity会创建ViewRootImpl和PhoneWindow,建立起与WMS的连接。

与WMS通信

第二步是ViewRootImpl与WMS通信。

接上第一步中在ViewRootImpl构造方法中通过WindowSession -> Binder.openSession构造出WindowSession。

由第一步7中WindowManagerImpl.addView -> … ->WMS.relayoutWindow根据Window测量的大小相对应创建出SurfaceControl,通过SurfaceControl.getSurface将测量结果写入outSurface内,此处的outSurface就是ViewRootImpl.mSurface,注意此处只有大小,还未有指向native surface的指针mNativeObject。

由第一步7中WindowManagerImpl.addView -> … ->WindowState.attch,创建出WindowToken用来标识Window类型,如子窗体(1000-1999),应用窗体(1-99)和系统窗体(2000-2999)。再创建WindowState——WMS端的Window对象,它持有Session与WindowManager通信,更重要的是调用Session.windowAddedLocked创建出SurfaceSession。

SurfaceSession构造方法里调用了nativeCreate,从这里开始就是native的世界,不是本文重点,但简单概括一下流程是通过创建SurfaceComposerClient与SurfaceFlinger进行交互,锁定一块共享内存,通过writeParcel返回给ViewRootImpl.mSurface,同时拥有了native surface的地址。

小结:当Activity准备显示时,会测量Window和添加Window,创建出WMS服务对应的WindowState,Surface和native Surface。

绘制

绘制四要素:bitmap(一块内存保存像素),canvas(画布用于画像素),paint(画笔),path(画的对象)。

应用无论是使用View/Canvas绘制(软件绘制,Skia),或者使用硬件加速绘制,最底层都是与Surface(OpenGL)进行交互。

再回到Activity的生命周期onCreate,调用setContentView创建一个不可见的DecorView,当ActivityThread.handleResumeActivity -> Activity.makeVisible设置DecorView为可见。

其中绘制的起点是ViewRootImpl.performTraversals -> ViewRootImpl.performMeasure -> ViewRootImpl.performLayout - > ViewRootImpl.performDraw调用作为根视图DecorView的measure,layout,draw方法来遍历视图树。

值得一提的是FrameBuffer的知识点,开始绘制时,会调用Surface.lockCanvas,由SurfaceFlinger锁定一块共享内存传递给Canvas,内存共享的是设备显存,在上面绘制相当于在屏幕上绘画。绘制结束调用Surface.unlockCanvasAndPost,从Suface上detach掉canvas,释放Surface。

触类旁通之SurfaceView

SurfaceView会创建一个Z轴靠下的新Window,通过挖洞(重叠区域变透明)使自己可见。

观察一下SurfaceView的内部结构,似乎和ViewRootImpl差不多,同时持有IWindowSession,Surface和MyWindow(同ViewRootImple.WindowSession)

relayoutWindow、addWindow、Surface一气呵成,流程比较简单,注意一下SurfaceHolder,一般使用SurfaceView时候都是操作SurfaceHolder.Callback,它作为内部类一开始就创建出来了,而在native surface创建完毕之后调用SurfaceHolder.Callback.surfaceCreated。

总结

Activity启动时除了通过ViewRootImpl读取各个参数确定Window的大小,位置等等,通过WMS创建出相应大小的Surface和一块共享内存,等待DecorView通过Canvas绘制画面。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 刘望舒 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android View和 Window 的关系
serena
2017/12/05
4.3K0
Android View和 Window 的关系
Android窗口管理分析(2):WindowManagerService窗口管理之Window添加流程
之前分析说过,WindowManagerService只负责窗口管理,并不负责View的绘制跟图层混合,本文就来分析WMS到底是怎么管理窗口的。初接触Android时感觉:Activity似乎就是Google封装好的窗口,APP只要合理的启动新的Activity就打开了新窗口,这样理解没什么不对,Activity确实可以看做一种窗口及View的封装,不过从源码来看,Activity跟Window还是存在不同。本文主要从窗口的添加流程来将APP端、WMS端、SurfaceFlinger端三块串联起来,主要说一
看书的小蜗牛
2018/06/29
3.1K0
Android高频面试专题 - 提升篇(一)Window、View、Activity
表示一个窗口的概念,是所有View的直接管理者,任何视图都通过Window呈现(点击事件由Window->DecorView->View; Activity的setContentView底层通过Window完成)
Android扫地僧
2020/03/19
2.5K0
Android高频面试专题 - 提升篇(一)Window、View、Activity
Android窗口管理分析(3):窗口分组及Z-order的确定总结
在Android系统中,窗口是有分组概念的,例如,Activity中弹出的所有PopupWindow会随着Activity的隐藏而隐藏,可以说这些都附属于Actvity的子窗口分组,对于Dialog也同样如此,只不过Dialog与Activity属于同一个分组。之间已经简单介绍了窗口类型划分:应用窗口、子窗口、系统窗口,Activity与Dialog都属于应用窗口,而PopupWindow属于子窗口,Toast、输入法等属于系统窗口。只有应用窗口与系统窗口可以作为父窗口,子窗口不能作为子窗口的父窗口,也就说
看书的小蜗牛
2018/06/29
2.9K0
Activity启动时View首次绘制的源码深度解析:从handleResumeActivity()到performTraversals()
这是整个绘制流程的起点,位于frameworks/base/core/java/android/app/ActivityThread.java:
李林LiLin
2025/07/18
1250
Android View源码解读:浅谈DecorView与ViewRootImpl
对于Android开发者来说,View无疑是开发中经常接触的,包括它的事件分发机制、测量、布局、绘制流程等,如果要自定义一个View,那么应该对以上流程有所了解、研究。本系列文章将会为大家带来View的工作流程详细解析。在深入接触View的测量、布局、绘制这三个流程之前,我们从Activity入手,看看从Activity创建后到View的正式工作之前,所要经历的步骤。以下源码均取自Android API 21。
Android技术干货分享
2019/08/22
7820
Android View源码解读:浅谈DecorView与ViewRootImpl
Window刨根问底
上篇文章中有说到Actiivity中window的一些知识,今天就和大家一起好好捋捋这个window。
码上积木
2020/12/11
5330
Window刨根问底
浅析 Android 的窗口
一、窗口的概念 在开发过程中,我们经常会遇到,各种跟窗口相关的类,或者方法。但是,在 Android 的框架设计中,到底什么是窗口?窗口跟 Android Framework 中的 Window 类又是什么关系?以手机QQ 的主界面为例,如下图所示,上面的状态栏是一个窗口,手机QQ 的主界面自然是一个窗口,而弹出的 PopupWindow 也是一个窗口,我们经常使用的 Toast 也是一个窗口。像 Dialog,ContextMenu,以及 OptionMenu 等等这些都是窗口。这些窗口跟 Window
腾讯Bugly
2018/03/23
3.9K0
浅析 Android 的窗口
一篇文章读懂Android Framework
本文旨在将Framework的框架描绘出来,主要是记录我一段时间关于android framework的学习,希望抛砖引玉,对于读者有一定的帮助。
做个快乐的码农
2021/12/22
5.5K0
一篇文章读懂Android Framework
ViewRootImpl的独白,我不是一个View(布局篇)
前一段时间写过两篇关于View的文章 Activity中的Window的setContentView 和 遇见LayoutInflater&Factory 。分析了Activity设置页面布局到页面View元素进行布局到底经历了一个怎么样的过程?
静默加载
2020/05/29
8470
Android自定义View:绘制前的准备-DecorView创建
回忆前文:Android自定义View基础:ViewRoot、DecorView & Window的简介,可看出最后1步 = 绘制
Carson.Ho
2022/03/25
7420
Android自定义View:绘制前的准备-DecorView创建
Activity、View、Window的理解一篇文章就够了
要了解这三者之间的关系,我们带着问题通过分析源码一步一步来揭开它们的神秘面纱! 文章有点长,首先要理解Activity、View、Window,我提出了一些问题,这篇文章可以解答如下问题: 1、为什么要设计Activity、View、Window? 2、Activity工作过程是什么样的?(理解Activity) 3、Window是什么?它的职能是什么? 4、View跟Window有什么联系? 5、Activity、View、Window三者如何关联?
用户2802329
2018/08/07
1.1K0
Activity、View、Window的理解一篇文章就够了
Android之View的诞生之谜
hello,大家好,平时大家都说自定义view,这次给大家带来有关view的相关知识,希望你喜欢!
陈宇明
2020/12/15
4390
Android之View的诞生之谜
Android | 理解 ViewRootImpl
ViewRootImpl 是 View 的最高层级,是所有 View 的根。ViewRootImpl 实现了 View 和 WindowManager 之间所需要的协议。ViewRootImpl 的创建过程是从 WindowManagerImpl 中开始的。View 的测量,布局,绘制以及上屏,都是从 ViewRootImpl 中开始的。
345
2022/03/25
1.3K0
Android | 理解 ViewRootImpl
Android自定义View绘制前的准备:DecorView创建 & 显示
回忆前文:Android自定义View基础:ViewRoot、DecorView & Window的简介,可看出最后1步 = 绘制
Carson.Ho
2019/06/20
9970
Window源码分析之Activity篇
Window表示一个窗口的概念,在日常开发中直接接触Window的机会并不多,但是在某些特殊时候我们需要在桌面上显示一个类似悬浮窗的东西,那么这种效果就需要用到Window来实现。Window是一个抽象类,它的具体实现是PhoneWindow。本文主要整理了Window有关源码的部分分析记录, 可能有差错的地方,请批评指正。
open
2020/03/19
7390
Window源码分析之Activity篇
Window十二问(快扶我起来,我还能问)
窗口。你可以理解为手机上的整个画面,所有的视图都是通过Window呈现的,比如Activity、dialog都是附加在Window上的。Window类的唯一实现是PhoneWindow,这个名字就更加好记了吧,手机窗口呗。
码上积木
2021/02/12
6400
Window十二问(快扶我起来,我还能问)
Android模拟面试,解锁大厂——从Activity创建到View呈现中间发生了什么?
前段时间公司招人,作为面试官,我经常让面试者简述View的绘制流程。他们基本都能讲明白View的测量(measure)、布局(layout)、绘制(draw)等过程。还有少数人会提到DecorView和ViewRootImp的作用。但是,当我继续追问关于Window的内容时,几乎没有人回答上来。而本章将会带你深入理解Window、DecorView、ViewRootImp。除此之外,你还能在本章找到以下问题的答案:
Android技术干货分享
2020/09/22
8700
Android模拟面试,解锁大厂——从Activity创建到View呈现中间发生了什么?
必要掌握!Window、WindowManager !
Window是View的管理者,当我们说创建Window时,一方面指实例化这个管理者,一方面指 用WindowManager.addView()添加view,以view的形式来呈现Window这个概念。
胡飞洋
2020/07/23
1.7K0
必要掌握!Window、WindowManager !
Android解析WindowManager(三)Window的添加过程
前言 在此前的系列文章中我们学习了WindowManager体系和Window的属性,这一篇我们接着来讲Window的添加过程。建议阅读此篇文章前先阅读本系列的前两篇文章。 1.概述 WindowManager对Window进行管理,说到管理那就离不开对Window的添加、更新和删除的操作,在这里我们把它们统称为Window的操作。对于Window的操作,最终都是交由WMS来进行处理。窗口的操作分为两大部分,一部分是WindowManager处理部分,另一部分是WMS处理部分。我们知道Window分为三大类
用户1269200
2018/02/01
1.6K0
Android解析WindowManager(三)Window的添加过程
推荐阅读
相关推荐
Android View和 Window 的关系
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档