View & ViewGroup
1. View是什么
View是Android中所有可视化元素的基类,是屏幕上能被用户看到并交互的 “最小原子”,核心职责分为两部分:
- 渲染职责:通过
measure()(测量自身尺寸)、layout()(确定在父容器中的位置)、draw()(将像素绘制到缓冲区)三个核心流程,完成自身视觉呈现(如TextView绘制文字、ImageView绘制图片); - 交互职责:通过
dispatchTouchEvent()(事件分发)、onTouchEvent()(事件处理)接收并响应用户的触摸、点击、滑动等输入事件,是用户与APP交互的“直接触点”。
2. ViewGroup是什么
ViewGroup是View的子类,作为“容器型View”,核心作用是管理子View的排列规则和层级,实现复杂页面的布局:
- 布局规则封装:不同ViewGroup对应不同布局逻辑(如
LinearLayout线性排列、RelativeLayout相对定位、ConstraintLayout约束布局),本质是通过重写onMeasure()/onLayout(),递归完成所有子View的尺寸测量和位置确定; - View树构建:一个Android页面的UI本质是一棵“View树”——>根节点是DecorView(ViewGroup),下层包含标题栏、内容区(ContentView)等子ViewGroup,最终叶子节点是Button、TextView等普通View;
- 事件分发中转:用户触摸事件会先传递到ViewGroup,再由ViewGroup根据子View的位置、可见性等规则,分发到目标子View,实现精准的交互响应。
核心总结:
(1) View是“UI原子”,负责自身渲染和交互;ViewGroup是“布局容器”,负责组织View树、制定布局规则;
(2) 应用通过嵌套ViewGroup和View,构建出任意复杂度的页面布局,通过View的事件回调实现用户交互。
Activity & ViewRootImpl
1.Activity是什么
Activity(活动,行动)是Android四大组件之一,并非直接参与UI绘制,而是承担两大核心角色:
- View的生命周期绑定者:Activity通过
setContentView()加载布局文件(或动态创建View),将View树与自身生命周期绑定——Activity的onResume()触发View的首次绘制,onPause()暂停View的交互和绘制,onDestroy()递归销毁整个View树; - 系统资源竞争参与者:Activity作为AMS管理的“最小资源单元”,会代表应用向系统申请CPU、内存等资源,AMS通过Activity的状态(前台/后台)决定应用进程的优先级,进而仲裁资源分配(如前台Activity的进程优先获取CPU资源)。
View自身无法直接与系统服务通信,必须通过ViewRootImpl完成UI布局的最终落地:
2.ViewRootImpl是什么
View自身无法直接与系统服务通信,必须通过ViewRootImpl完成UI布局的最终落地
所以,它是中间者。
-
ViewRootImpl的创建时机:Activity的
onResume()执行后,系统会为Activity的View树创建ViewRootImpl,它是View树的“隐形根节点”(不在View树结构中,但持有DecorView的引用); -
核心作用:
① 触发View树的measure()→layout()→draw()全流程,是UI绘制的“总开关”;
② 作为View与WMS的通信中介(通过Binder),向WMS上报View的尺寸、位置,接收WMS的布局指令;
③ 处理系统输入事件(如触摸、按键),将事件分发到View树的目标View。
核心总结
(1) Activity 是 View的“老板”:决定View的生死、为View争取系统资源;
(2) ViewRootImpl 是 View的“执行者”:承接Activity的指令,触发View布局绘制,对接系统服务;
(3)View 是 “干活的”:完成具体的渲染和交互,不关心生命周期和系统通信。
ActivityManagerService
AMS(ActivityManagerService)是System Server中最核心的服务,以Activity为基本颗粒度,实现对应用的全生命周期管控
AMS:基于Activity管控App生命周期、进程调度与资源分配
1. 核心职责
- Activity生命周期管控:通过
ActivityStack/ATMS(Android 10+拆分)管理Activity任务栈,触发Activity的onCreate()/onResume()等生命周期回调,处理页面跳转、回退、多任务切换; - 进程调度:根据Activity的启动需求,通过Zygote孵化应用进程;维护进程优先级(前台进程>可见进程>后台进程),触发低内存回收(LMK)杀死低优先级进程;
- 资源分配与权限管控:仲裁不同应用的资源竞争(如CPU/内存分配),校验Activity启动的权限(如后台启动Activity的限制),是应用与系统资源之间的“仲裁者”。
2. AMS与View/Activity的关联
AMS不直接接触View,仅通过管控Activity间接影响View:
- AMS通知Activity启动——> Activity创建View树——> ViewRootImpl触发View绘制;
- AMS将Activity标记为“后台状态”→系统降低应用进程优先级→View的绘制帧率降低(节省资源);
- AMS销毁Activity——> Activity递归销毁View树 ——> View释放资源。
核心总结:
(1)AMS是“应用大管家”:只认Activity,不管View,通过管控Activity实现对应用的整体调度;
(2)AMS的决策(如进程优先级、Activity状态)会间接决定View的渲染资源和生命周期。
Window
1. Window的本质:系统级的“UI展示容器”
Window是Android中承载所有可视化内容的 抽象 载体,是WMS管理的最小单元,核心特征:
- 每个Activity默认对应一个
PhoneWindow(Window的子类),Activity的View树最终挂载在PhoneWindow的DecorView上; - Window是“无实体的画布”:本身不可见,但定义了UI的显示区域、交互规则,是连接Activity与WMS的核心媒介;
- 一个应用可拥有多个Window:除了Activity的主Window。 Dialog、Toast、悬浮窗等都会创建独立的Window。
2. Activity与Window的绑定逻辑
-
DecorView是Window的“根View”:封装了标题栏、导航栏、内容区等系统级UI结构,Activity的View树仅占DecorView的“内容区”;
-
Activity的核心作用是“填充Window内容”:Window由系统创建,Activity负责将View树挂载到Window上,让Window有“可显示的内容”。
核心总结:
(1) Window是“系统级UI容器”,WMS专门管理它;Activity是“内容填充者”,负责为Window提供View树
(2) 关系类比:Window是“空房间”, Activity是“装修师傅”,View是“家具”——师傅把家具放进房间,房间的大小、位置由系统(WMS)决定。
WindowManagerService
WMS(WindowManagerService)是System Server中负责窗口管理的核心服务,以Window为基本颗粒度,实现对所有系统窗口的统一管控
WMS:基于Window实现系统窗口的全生命周期管理
1. 核心职责
- Window生命周期管理:为每个Window创建
WindowState对象,管理Window的创建、显示、隐藏、销毁,响应AMS的Window创建/销毁指令; - 窗口层级管理:定义严格的窗口层级规则(从下到上):
壁纸层 → 应用窗口层(Activity) → 子窗口层(Dialog) → 系统窗口层(状态栏/导航栏) → 悬浮窗层
-
布局计算:结合DMS提供的显示设备参数(屏幕分辨率、可用区域),计算每个Window的位置、大小,处理分屏、多窗口、悬浮窗的布局适配;
-
事件分发:接收InputManagerService(IMS)的触摸/按键事件,根据Window的位置、焦点状态,将事件精准分发给目标Window的ViewRootImpl;
-
Surface申请:为每个Window向SurfaceFlinger申请Surface(绘图缓冲区),维护Window与Surface的绑定关系。
2. WMS与其他组件的关联
- 与AMS:接收AMS的Window创建指令,向AMS反馈Window的焦点/可见状态(如Window隐藏→AMS触发Activity.onPause);
- 与DMS(DeviceManagerService):获取显示设备的配置(分辨率、刷新率),适配多屏显示的Window布局;
- 与SurfaceFlinger:传递Window的层级、位置信息,让SurfaceFlinger完成最终的图层合成。
核心总结:
(1) WMS是“窗口总管理员”:管所有Window的位置、层级、交互,是Window与SurfaceFlinger之间的“中介”
(2) WMS不关心Window内的View内容,只关心Window的整体属性(位置、大小、层级)。
Surface
1. Surface的本质:“绘图缓冲区”(生产者-消费者模型)
Surface是Android中用于绘制图像的内存缓冲区,核心特征:
- 采用“生产者-消费者”模型:应用(View)是“生产者”,向Surface写入绘制数据;SurfaceFlinger是“消费者”,从Surface读取数据进行合成;
- 每个Surface对应一块
GraphicBuffer(基于Gralloc分配的显存),避免CPU与GPU之间的频繁数据拷贝,保证渲染性能。
2. Android系统常见的Surface图层(按层级从下到上)
| 图层类型 | 对应Window/Surface来源 | 作用 |
|---|---|---|
| 壁纸层 | 壁纸服务的Window | 显示桌面壁纸 |
| 应用窗口层 | Activity的PhoneWindow | 显示应用的核心UI |
| 子窗口层 | Dialog/Toast的Window | 显示应用的弹窗/提示 |
| 系统窗口层 | 状态栏/导航栏/锁屏的Window | 显示系统核心UI |
| 悬浮窗层 | 悬浮窗/输入法的Window | 显示顶层交互UI |
3. 普通View渲染到Surface的流程
-
关键细节:View的绘制数据不会直接到屏幕,而是先写入Surface的显存缓冲区,SurfaceFlinger按需读取;
-
ViewRootImpl是View与Surface的“写入中介”,负责将View树的绘制结果批量写入Surface。
4. 特殊View(SurfaceView/TextureView)的独立Surface处理
对于视频播放、3D渲染等高性能场景,普通View的共享Surface会成为性能瓶颈,因此Android设计了专用View:
- SurfaceView:申请独立的Surface(脱离Activity主Window的Surface),由WMS单独管理,视频数据直接写入该Surface,与GUI层Surface并行
- TextureView:基于
SurfaceTexture封装,将视频数据转为OpenGL纹理,融入普通View树(无独立Surface),支持对视频的裁剪、旋转等操作 - 核心差异:SurfaceView有独立Layer(层),性能更高;TextureView无独立Layer,灵活性更强。
核心总结:
Surface是“绘图显存缓冲区”,是View绘制数据与SurfaceFlinger之间的“数据载体”
普通View共享Activity主Window的Surface,特殊View拥有独立Surface,满足高性能渲染需求。
SurfaceFlinger
SurfaceFlinger管理Surface合成到Display(显示器),VSync同步整个显示框架
1. DMS:Display的“硬件管家”
DMS(DisplayManagerService)是显示设备的基础管理服务,核心作用:
- 管理物理/虚拟显示设备(主屏、外接显示器、投屏),维护显示参数(分辨率、刷新率、色域);
- 向WMS/SurfaceFlinger提供显示设备的硬件信息,是“显示硬件与系统服务的中介”。
2. SurfaceFlinger:图层合成的“最终执行者”
SurfaceFlinger是运行在独立进程的核心服务,负责将所有Surface合成为最终的屏幕图像
• 合成方式:优先使用HWC(硬件合成),由显示芯片直接合成图层,性能高、功耗低;复杂场景用GPU合成。
3. VSync信号:整个显示框架的“同步时钟”
VSync(垂直同步)信号由Display硬件生成(如60Hz屏幕每16.6ms一次),核心作用:
- 同步View绘制:
Choreographer接收VSync信号后,触发ViewRootImpl的performTraversals()(measure/layout/draw),保证View绘制节奏与屏幕刷新率一致; - 同步SurfaceFlinger合成:SurfaceFlinger在VSync信号到来时,统一合成所有Layer,避免“屏幕撕裂”;
- 核心价值:消除绘制与合成的异步性,保证画面流畅。
核心总结:
(1) DMS(DisplayManagerService)管“显示硬件参数”, SurfaceFlinger管“图层合成”
(2) VSync是“全局同步时钟”,让View绘制、SurfaceFlinger合成、屏幕显示保持节奏一致
(3) FrameBuffer是“最终帧缓冲区”,合成后的图像写入此处,由Display硬件直接读取显示。
完整链路总结(View→Display)
用户操作→View接收交互事件→Activity处理业务逻辑→AMS管控Activity生命周期→
Activity填充Window内容→WMS管理Window布局/层级→WMS为Window申请Surface→
View绘制数据写入Surface→SurfaceFlinger合成所有Surface的Layer→
SurfaceFlinger将合成图像写入FrameBuffer→Display硬件显示图像
各核心组件的关键角色
- AMS(ActivityManagerService):管控Activity生命周期、进程调度,是“应用资源的仲裁者”;
- WMS(windowManagerService):管控Window布局、层级、事件分发,是“窗口的管理者”;
- DMS(DisplayMnagerService):管控显示设备参数,是“显示硬件的中介”;
- SurfaceFlinger:管控图层合成、VSync同步,是“图像合成的最终执行者”;
- Activity:View的生命周期总管,Window的内容填充者;
- View:UI渲染与交互的最小单元,Surface的数据生产者;
- Window:WMS的管理单元,Surface的载体;
- Surface: View绘制数据的显存缓冲区,Layer的数据来源。
核心关键点回顾:
整个显示体系的核心逻辑是“分层解耦”:View管绘制、Activity管生命周期、Window管系统交互、Surface管数据载体、SurfaceFlinger管合成、Display管硬件输出;
AMS/WMS/DMS/SurfaceFlinger各司其职:AMS管应用、WMS管窗口、DMS管显示硬件、SurfaceFlinger管图像合成;
VSync信号是全局同步核心,保证绘制、合成、显示的节奏一致,是画面流畅的关键。