Android AMS和WMS机制原理入门讲解。

896 阅读4分钟

AMS(ActivityManagerService)和 WMS(WindowManagerService)是 Android 系统中两个核心的系统服务,分别负责管理应用组件(如 Activity)和窗口系统。以下是它们的机制和原理的详细说明:

一. AMS(ActivityManagerService)

AMS 是 Android 系统中负责管理应用组件生命周期和任务栈的核心服务。它运行在 system_server 进程中,是 Android 框架层的重要组成部分。

主要职责:

  1. 管理 Activity 生命周期

    • 负责启动、暂停、恢复、停止和销毁 Activity。
    • 通过 ActivityStack 管理 Activity 的任务栈。
  2. 管理应用进程

    • 启动和销毁应用进程。
    • 监控应用进程的状态(如内存使用情况)。
  3. 管理任务栈(Task Stack)

    • 维护 Activity 的任务栈,确保 Activity 按照正确的顺序显示。
    • 处理任务栈的切换和回退(如按下返回键)。
  4. 权限管理

    • 检查应用是否具有执行某些操作的权限(如启动 Activity、访问服务等)。
  5. 广播管理

    • 管理广播的发送和接收。
  6. 服务管理

    • 管理服务的启动、绑定和销毁。

工作机制:

  • Activity 启动流程

    1. 应用通过 startActivity 请求启动一个 Activity。
    2. AMS 接收到请求后,检查目标 Activity 的权限和启动模式。
    3. AMS 创建或复用目标 Activity 的进程。
    4. AMS 通知目标进程的 ActivityThread 创建并启动目标 Activity。
    5. AMS 更新任务栈,并将目标 Activity 置于栈顶。
  • 进程管理

    • AMS 通过 ProcessRecord 记录每个应用进程的状态。
    • 当系统内存不足时,AMS 会根据优先级(如前台进程、可见进程等)决定是否杀死某些进程。
  • 任务栈管理

    • AMS 使用 ActivityStack 和 TaskRecord 管理 Activity 的任务栈。
    • 每个任务栈包含一组相关的 Activity,用户可以通过返回键在栈中导航。

二. WMS(WindowManagerService)

WMS 是 Android 系统中负责管理窗口和显示的核心服务。它运行在 system_server 进程中,与 SurfaceFlinger 协作,负责将应用的 UI 渲染到屏幕上。

主要职责:

  1. 管理窗口

    • 负责创建、销毁和调整窗口。
    • 管理窗口的层级(Z-order)和可见性。
  2. 处理输入事件

    • 将触摸事件、按键事件等分发给正确的窗口。
  3. 管理 Surface

    • 与 SurfaceFlinger 协作,为每个窗口分配 Surface。
    • 管理 Surface 的绘制和合成。
  4. 管理动画

    • 处理窗口的过渡动画(如 Activity 切换动画)。
  5. 管理屏幕旋转

    • 处理屏幕旋转时的窗口布局调整。

工作机制:

  • 窗口创建流程

    1. 应用通过 WindowManager 请求创建一个窗口。
    2. WMS 接收到请求后,为窗口分配 Surface。
    3. WMS 将窗口添加到窗口树中,并确定其层级和可见性。
    4. WMS 通知 SurfaceFlinger 创建对应的 Surface。
    5. 应用通过 Surface 进行 UI 绘制。
  • 输入事件分发

    1. 输入事件(如触摸事件)由输入系统生成并发送到 WMS
    2. WMS 根据窗口的层级和位置确定目标窗口。
    3. WMS 将事件分发给目标窗口的 ViewRootImpl
    4. ViewRootImpl 将事件传递给目标 View 进行处理。
  • Surface 管理

    • WMS 为每个窗口分配一个 Surface,用于 UI 绘制。
    • WMS 与 SurfaceFlinger 协作,将多个 Surface 合成为最终的屏幕图像。

三. AMS 和 WMS 的协作

AMS 和 WMS 在 Android 系统中紧密协作,共同完成应用的显示和交互。

协作场景:

  1. Activity 启动

    • AMS 负责启动 Activity 并管理其生命周期。
    • WMS 负责为 Activity 创建窗口并管理其显示。
  2. 窗口切换

    • 当用户切换到另一个 Activity 时,AMS 更新任务栈。
    • WMS 调整窗口的层级和可见性,并处理过渡动画。
  3. 输入事件处理

    • WMS 将输入事件分发给当前活动的窗口。
    • AMS 确保目标 Activity 处于活动状态。
  4. 屏幕旋转

    • AMS 通知 Activity 重新创建。
    • WMS 调整窗口的布局和 Surface。

四. 关键数据结构

AMS:

  • ActivityRecord:记录一个 Activity 的信息。
  • TaskRecord:记录一个任务栈的信息。
  • ProcessRecord:记录一个应用进程的信息。
  • ActivityStack:管理 Activity 的任务栈。

WMS:

  • WindowState:记录一个窗口的状态。
  • WindowToken:标识一组相关的窗口。
  • DisplayContent:管理一个屏幕上的所有窗口。
  • Surface:用于窗口的 UI 绘制。

五. 总结

特性AMS(ActivityManagerService)WMS(WindowManagerService)
主要职责管理 Activity 生命周期、任务栈、进程管理窗口、输入事件、Surface、动画
协作对象应用进程、ActivityThreadSurfaceFlinger、输入系统
关键数据结构ActivityRecord、TaskRecord、ProcessRecordWindowState、WindowToken、Surface
典型场景Activity 启动、任务栈管理窗口创建、输入事件分发、屏幕旋转

AMS 和 WMS 是 Android 系统的核心服务,分别负责应用组件和窗口系统的管理。它们通过紧密协作,确保应用的正常运行和用户的交互体验。理解它们的机制和原理,有助于更好地开发和调试 Android 应用。

更多分享

  1. Android Jetpack相关面试题分享(一)
  2. Android Jetpack原理相关面试题分享(二)
  3. Android Kotlin协程相关面试题分享
  4. Android 架构以及优化相关面试题分享