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 图标启动时,系统做了这些事:
- 创建Application(如果还没创建的话)
- 创建Activity,并自动为它创建一个Window(PhoneWindow)
- 给这个 Window 分配一个WindowToken,注册到 WindowManager
- 你调用
setContentView(R.layout.main),系统把你的布局解析成一棵View树,挂到 Window 上 - Window 通过Display把最终画面渲染到物理屏幕上
希望这个比喻能帮你建立起清晰的概念框架!
