Android Window:界面的舞台与系统的桥梁

546 阅读2分钟

Android Window:界面的舞台与系统的桥梁

Window(窗口)就像手机屏幕上的“舞台”,负责管理 View(演员)的表演流程,让每个界面元素(按钮、文字、图片)能有序上台、退场,还能处理“聚光灯”(焦点)和“舞台特效”(动画)。


一、Window的本质:Activity与View的桥梁

在 Android 中,Window 是一个抽象概念,它代表了应用界面的一个顶级容器

  • ActivityWindow 的关系ActivityWindow 是一对一的关系。Activity 的核心职责是管理业务逻辑和生命周期,而其对应的 Window 则负责界面显示和事件处理
  • WindowView 的关系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 接收到的事件,分发给其内部的 DecorViewDecorView 随后会根据事件的坐标和视图树结构,将事件传递给最上层的 View

3. 系统对接:与底层渲染服务的通信

Window 充当了应用层与底层系统服务之间的桥梁。

  • WindowManagerWindow 通过 WindowManager 这个接口与 WindowManagerService 进行通信。
  • Surface:每个 Window 都有一个 Surface,它代表了一块用于绘制的内存区域。Window 通过 SurfaceSurfaceFlinger(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 的进入和退出添加自定义的动画效果。