Android Window:界面的舞台与系统的桥梁
Window(窗口)就像手机屏幕上的“舞台”,负责管理 View(演员)的表演流程,让每个界面元素(按钮、文字、图片)能有序上台、退场,还能处理“聚光灯”(焦点)和“舞台特效”(动画)。
一、Window的本质:Activity与View的桥梁
在 Android 中,Window 是一个抽象概念,它代表了应用界面的一个顶级容器。
Activity与Window的关系:Activity和Window是一对一的关系。Activity的核心职责是管理业务逻辑和生命周期,而其对应的Window则负责界面显示和事件处理。Window与View的关系:Window是所有View的宿主。它通过setContentView()方法,将View树添加到自己的**根视图(DecorView)**中,从而实现了View在屏幕上的显示。
二、Window的核心职责
Window 的存在,使得 Android 界面系统高度解耦,并具备强大的扩展性。
1. 界面管理:控制视图树的生命周期
Window 负责管理其内部的整个 View 树的生命周期。setContentView()、addContentView() 等方法都是 Window 提供的,用于添加和管理 View。
setContentView()的底层实现:当你调用setContentView()时,Window会找到其根视图DecorView中的内容区域FrameLayout,然后将你的布局文件解析并添加到这个FrameLayout中。
2. 事件分发:从系统到视图的传递链
Window 是系统事件(如触摸、按键)的第一个接收者。
- 事件传递链:
WindowManagerService->Window->DecorView->View树。 Window负责将从WindowManagerService接收到的事件,分发给其内部的DecorView。DecorView随后会根据事件的坐标和视图树结构,将事件传递给最上层的View。
3. 系统对接:与底层渲染服务的通信
Window 充当了应用层与底层系统服务之间的桥梁。
WindowManager:Window通过WindowManager这个接口与WindowManagerService进行通信。Surface:每个Window都有一个Surface,它代表了一块用于绘制的内存区域。Window通过Surface与SurfaceFlinger(Android 的合成器)通信,将自己的界面画面提交给系统进行合成和显示。
三、Window在开发中的应用场景
-
自定义窗口样式:
- 透明背景:
window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))。 - 全屏模式:
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, ...)。 - 背景变暗:
window.setDimAmount(0.5f),常用于Dialog。
- 透明背景:
-
悬浮窗(Floating Window) :
- 通过
WindowManager直接向系统添加一个View,并设置其类型为TYPE_APPLICATION_OVERLAY等,从而创建一个独立于Activity的窗口。
- 通过
-
窗口动画:
- 通过设置
window.setWindowAnimations(),可以为Activity的进入和退出添加自定义的动画效果。
- 通过设置