Android 窗口显示(一)—— Activity、Window 和 View 之间的联系

1. 核心组件解析

1.1 Activity

Activity 可简单理解为应用程序中的一个"屏幕"或"页面",是用户与应用进行交互的容器,应用逻辑的载体

Activity 不直接处理 UI 绘制,而是通过生命周期回调管理业务逻辑,还作为上下文环境提供资源访问。

当系统创建 Activity 时,会同步触发 Window 的创建流程。

1.2 Window

Window 是抽象类,是连接系统服务与应用视图的桥梁 ,其唯一实现是PhoneWindow。核心职责包括:

  • 管理View的添加/删除
  • 控制窗口属性(背景、标题栏等)
  • 处理输入事件分发
  • 连接SurfaceFlinger进行界面合成

每个 Activity 都会创建一个 Window 用于承载 View 视图的显示,Window 是一个抽象类,提供显示接口,PhoneWindow 是其唯一的实现类。

1.3 View

View 是 UI 层的基础构件,可视化的原子单元。

作为所有UI组件的基类,View承担着:

  • 测量布局:onMeasure()确定自身大小
  • 位置计算:onLayout()确定子元素位置
  • 界面绘制:onDraw()实现视觉呈现
  • 事件响应:onTouchEvent()处理用户交互

2. 三者的协同关系

2.1 Activity 与 Window

每个 Activity 都包含一个 Window 对象,二者为共生关系,即每个 Activity 持有唯一的 PhoneWindow 实例。二者生命周期同步。

Activity 通过操作 Window 来间接控制视图的添加、显示和交互,如 Activity 通过 setContentView() 委托 Window 处理。

2.2 Window 与 View

Window 是一个容器,用于承载视图(View),二者是容器与内容关系。View 通过 Window 被加载到屏幕上,并接受用户的输入事件。Window 还负责处理视图之间的交互和事件传递。

setContentView 首次调用时,会创建 DecorView,解析 XML 布局并将其挂载到 DecorView 的 ContentView 区域,并建立与 ViewRootImpl 的连接。

DecorView:是最顶层的 View,是一个 FrameLayout 子类,最终会被加载到 Window 当中,它内部只有一个垂直方向的 LinearLayout,分为两部分:

  1. TitleBar:屏幕顶部的状态栏
  2. ContentView:Activity 对应的 XML 布局,通过 setContentView 设置到 DecorView 中。

2.3 Activity 与 View

虽然 Activity 不直接负责视图的绘制和显示,但它通过调用 Window 的方法来间接控制 视图的添加、显示和交互。例如,在 Activity 中调用 setContentView 方法实际上是在调用 Window 的setContentView 方法,将视图添加到 Window 上。

2.4 三者关系

Activity、Window和View的协作体现了Android系统分层解耦的设计哲学:

  • Activity:用户交互的起点,业务逻辑的容器
  • Window:系统与应用的桥梁,视图管理的策略层
  • View:视觉呈现的基础,事件响应的终点

Activity、Window和View三者形成了Android UI系统的黄金三角关系,其对应关系可概括为:

组件 角色定位 职责 生命周期依赖
Activity 业务指挥官 管理应用逻辑和用户交互流 主导三者生命周期
Window 系统协调官 连接系统服务与视图渲染 随Activity创建销毁
View 界面执行者 实现具体绘制和事件响应 由Window管理生命周期

这种分层架构体现了关注点分离的设计哲学:

  1. Activity 作为战略层:专注业务逻辑和全局决策
  2. Window 作为战术层:制定视图管理策略和资源分配
  3. View 作为执行层:实现具体的界面渲染和交互响应

三者协作的本质:

  • Activity是发起者:通过 setContentView 触发 UI 创建流程
  • Window是组织者:构建DecorView并管理视图树
  • View是实现者:完成具体的测量、布局和绘制工作
相关推荐
平头哥AI21 小时前
Day 22 _ 包装错误别丢链_%w、errors.Is 与 errors.As
android·服务器·学习·golang·go
聚美智数1 天前
图片广告检测-图片审核-图片广告识别-图像广告检测
android
早睡早起身体好1231 天前
用 XGrammar 约束大模型工具调用:解决参数为空的问题
android·人工智能·神经网络·机器学习·自然语言处理·vllm
大佐不会说日语~1 天前
Android 16 下 uni-app APP 提示“网络连接失败”的排障与修复
android·uni-app
老苗项目实战1 天前
Java工程师高频面试题(基于近一年的真实面试记录整理)
java·开发语言·面试·预见猿份·老苗项目实战
2501_915106321 天前
苹果App Store上架费用及流程全面解析
android·ios·小程序·https·uni-app·iphone·webview
YF02111 天前
Android 16系统App开机自启动方案
android
hm宋1 天前
安卓手机卡顿优化 —— 背景与使用指南
android
haon11221 天前
海外信贷的策略全生命周期:从准入到还款的本地化布防
大数据·开发语言·深度学习·面试·职场和发展·产品经理
OxYGC1 天前
[Android] [WatchOS]智能手表第一篇: 实用工具与应用推荐
android·智能手表