当前位置: 首页 > news >正文

Android中Activity,Window,Application,WindowToken,View,Display之间关系用通俗形象的方式介绍下

Android中Activity,Window,Application,WindowToken,View,Display之间关系用通俗形象的方式介绍下

这六个概念确实容易让人混淆,但它们之间的关系其实非常清晰。我们可以用一个**"开电影院"**的比喻,把它们全部串联起来:


🎬 用"开电影院"来理解

Application = 电影公司

它是整个 App 的大管家,一个 App 启动时只创建一个 Application 实例。它不管具体放哪部电影,只负责全局资源的初始化(比如数据库、网络配置),以及在整个 App 生命周期内共享数据。

Activity = 一个放映厅

每个 Activity 就是一个独立的放映厅。一个电影公司(Application)可以开多个放映厅(Activity),每个厅放不同的电影(不同的界面)。放映厅有自己的生命周期——开门迎客(onResume)、中场休息(onPause)、关门清场(onDestroy)。

Window = 放映厅里的"银幕"

每个放映厅(Activity)里都有一块银幕(Window),具体实现叫PhoneWindow银幕才是真正负责"显示画面"的东西,Activity 本身不画任何东西,它只是通过setContentView()告诉银幕:"把这部电影(布局)放上去"。

View = 银幕上的"画面内容"

View 就是银幕上显示的具体内容——演员、字幕、特效。所有的按钮、文本、图片都是 View。它们被组织成一棵树(View Tree),挂在银幕(Window)上。最顶层的那个 View 叫DecorView,它相当于银幕的边框+内容区的总和。

Display = 物理屏幕/投影仪

Display 代表真实的物理显示设备。大多数手机只有一个 Display(内置屏幕),但如果连接了副屏或投屏,就会有多个 Display。你可以把同一个放映厅(Activity)的画面投到不同的投影仪(Display)上——这就是前面说的"多屏异显"。

WindowToken = 银幕的"放映许可证"

这是最抽象的一个概念。WindowToken 是 WindowManager 颁发给 Window 的一张**"身份证"或"许可证"**。它的作用是:

  • 证明身份:告诉系统"这个 Window 是合法的,属于某个 Activity"。
  • 分组管理:系统通过 WindowToken 把属于同一个 Activity 的所有 Window(比如 Activity 主窗口 + 它弹出的 Dialog)归为一组,统一管理它们的层级和显示顺序。
  • 安全控制:没有合法的 WindowToken,你就不能随便在别的 App 上面画东西(防止恶意悬浮窗)。

📌 一句话总结它们的关系

Application(电影公司)开了一个Activity(放映厅),放映厅里挂了一块Window(银幕),银幕上播放着View(画面内容),画面最终通过Display(投影仪)投射出来,而WindowToken(放映许可证)确保这块银幕是合法挂载的。


🔗 层级关系图

Application (全局大管家) └── Activity (一个页面/放映厅) └── Window (银幕,PhoneWindow) └── DecorView (银幕边框+内容区) └── View Tree (具体画面:按钮、文本、图片...) WindowToken ←── 绑定 ──→ Window (身份证明) Display (物理屏幕,Window 最终画到这里)

💡 一个实际场景帮你加深理解

当你点击 App 图标启动时,系统做了这些事:

  1. 创建Application(如果还没创建的话)
  2. 创建Activity,并自动为它创建一个Window(PhoneWindow)
  3. 给这个 Window 分配一个WindowToken,注册到 WindowManager
  4. 你调用setContentView(R.layout.main),系统把你的布局解析成一棵View树,挂到 Window 上
  5. Window 通过Display把最终画面渲染到物理屏幕上

希望这个比喻能帮你建立起清晰的概念框架!

http://www.jsqmd.com/news/913159/

相关文章:

  • 别再死记硬背Sarsa公式了!用Python手搓一个走迷宫AI,5分钟搞懂On-Policy和Q-learning的区别
  • 从喷头滴漏到AI节水37%:一个Lindy灌溉集群的30天自动化演进日记(含Prometheus监控看板+告警阈值SOP)
  • 2026年AI写作辅助平台深度评测:6款工具专业水准得分排名
  • 基于Arduino与超声波传感器的高尔夫自动喂球器设计与实现
  • 基于Arduino与BNO055陀螺仪的桌面绘图机器人:从传感器融合到G代码解析
  • 2026年圆盘式过滤器行业评测:核心性能横向对比 - 优质品牌商家
  • 别再傻傻分不清!用Python代码5分钟搞懂机器学习里的min和argmin
  • 用Python和SVM给水质‘看相’:手把手教你从200张水色图到水质分类模型
  • 从HDRi到游戏画面:手把手教你用Blender和Python预处理IBL环境贴图(含代码)
  • 工业防爆监控技术解析与山东区域选型实践
  • Windows开始菜单修复终极指南:三步恢复消失的磁贴
  • Codex 新增“宠物”功能:不只是可爱,而是一个轻量工作状态提醒器
  • 工具使用、代理和 Voyager 论文
  • 93、CAN FD数据链路层核心:帧结构对比与DLC编码革命
  • 别再被多重共线性坑了!用Python的sklearn手把手教你调岭回归的alpha参数
  • 2026年嵌丝道口板TOP5厂商盘点 品质与实力对比 - 优质品牌商家
  • 172 号卡哪个推荐码是官方一级?10000 置顶权限真实解析 - 172号卡
  • 用Python实战贾俊平《统计学》第八章:手把手教你用SciPy搞定假设检验课后题
  • Lindy自动化项目管理:从概念验证到规模化落地的7个关键决策节点(附20年踩坑清单)
  • 第T9周:猫狗识别2
  • 从电容充放电到MOSFET驱动:一个被忽视的‘能量视角’与热设计陷阱
  • 单细胞分析入门:用Scanpy的AnnData对象管理你的数据,从h5ad读写到基础过滤
  • C语言分支和循环总结
  • Harness 中的请求影子复制:用于离线分析
  • 2026年5月更新:浙江老爹鞋制造商业内推荐与趋势解析 - 2026年企业资讯
  • Claude技术债爆发前夜(2024Q2实测预警:87%企业已超临界阈值)
  • 我的Obsidian知识库,现在可以自动剪藏笔记到本地了
  • 【从零开始的JUC并发第四章】:JUC常用工具类
  • 新手也能跑通大模型,Hugging Face 环境配置与模型加载指南
  • 纯小白向|OpenClaw 本地环境搭建,一步一图教学