Framework 窗口添加流程分析1之 ViewRootImpl 创建

本文详细剖析了Android中Activity窗口添加的过程,从ActivityThread的handleResumeActivity开始,经过performResumeActivity、makeVisible等步骤,重点讲解了ViewRootImpl的创建和View的绘制流程,涉及到WindowManagerImpl、WindowManagerGlobal以及WMS的交互。文章为理解Android应用程序界面显示的底层机制提供了深入见解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Framework 窗口添加流程分析1之 ViewRootImpl 创建

ActivityThread.handleResumeActivity()

// 第一部分析: 执行resumed流程,回调 Activity.onResume()

-> ActivityThread.performResumeActivity()

​ -> Activity.performResume()

​ -> Activity.dispatchActivityPreResumed()

​ -> Instrumentation.callActivityOnResume()

​ -> Activity.onResume()

​ -> FragmentController.dispatchResume()

​ -> Activity.dispatchActivityPostResumed()

​ -> ActivityThread.reportTopResumedActivityChanged()

// 第二部分析: 添加窗口,绘制应用界面,使 activity 可见

-> Activity.makeVisible()

​ -> WindowManagerImpl.addView()

​ -> WindowManagerGlobal.addView()

​ -> new ViewRootImpl()

​ -> DecorView.setLayoutParams()

​ -> ViewRootImpl.setView()

​ // 第三部分析: View 的绘制

​ -> ViewRootImpl.requestLayout()

​ -> checkThread() // 检查线程是不是创建 ViewRootImpl 的原始线程(可以大概理解为主线程)

​ -> mLayoutRequested = true

​ -> scheduleTraversals()

​ -> mHandler.getLooper().getQueue().postSyncBarrier()

​ -> mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable)

​ -> mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);

​ -> performTraversals()

​ -> performMeasure()

​ -> performLayout()

​ -> performDraw()

​ -> Session.addToDisplayAsUser() // Binder call

​ -> WMS.addWindow()

​ -> DecorView.setVisibility()

// frameworks/base/core/java/android/app/ActivityThread.java
@Override
public void handleResumeActivity(IBinder token, boolean finalStateRequest, boolean isForward,String reason) {
   
   
    // 省略部分
    // 这里会执行resumed相关流程,同时会回调 Activity.onResume()
    final ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason);
    if (r == null) {
   
   
        // We didn't actually resume the activity, so skipping any follow-up actions.
        return;
    }
    final Activity a = r.activity;

    if (!r.activity.mFinished && willBeVisible && r.activity.mDecor != null && !r.hideForNow) {
   
   
        // 省略部分
        r.activity.mVisibleFromServer = true;
        mNumVisibleActivities++;
        if (r.activity.mVisibleFromClient) {
   
   
            // 添加窗口,绘制应用界面,使 activity 可见
            r.activity.
<think>嗯,用户想了解Android窗口管理服务(WMS)的工作原理和实现细节。首先,我需要回忆一下WMS在Android系统中的作用。记得WMS负责窗口创建、布局和绘制,和Surface的管理有关。可能需要参考之前提供的引用内容,比如引用[1]提到PhoneWindow处理通用逻辑,而WindowManagerImpl实际负责将View添加到WMS。这可能涉及到窗口添加流程。 接下来,用户可能需要知道WMS的核心机制。比如窗口的层级(Z-order)和布局,还有与SurfaceFlinger的交互。需要解释WMS如何管理窗口的堆叠顺序和计算它们的可见区域。引用[4]提到了systemserver进程安装framework-res.apk,可能和系统服务的启动有关,比如WMS作为系统服务运行在system_server进程中。 另外,窗口添加过程可能涉及跨进程通信,比如引用[2]中的ActivityManager.getService().startActivity(),虽然这更多是启动Activity,但Activity的窗口管理最终会调用到WMS。这里可能需要说明应用进程通过Binder与WMS通信,请求创建窗口。 还有,窗口绘制和合成部分。WMS配合SurfaceFlinger处理图层,确保正确显示。需要解释Surface的作用,每个窗口对应一个Surface,由WMS分配。 用户可能还想知道WMS与其他组件的关系,比如ActivityManagerService和ViewRootImpl。比如,ViewRootImpl作为应用和WMS的中介,处理布局和输入事件。引用[3]中的bindService流程可能和Service的窗口相关,但不太确定,可能需要略过。 在实现细节方面,WMS使用WindowState来跟踪窗口状态,处理焦点和输入事件的分发。这涉及到事件传递机制,比如触摸事件如何路由到正确的窗口。 需要确保回答结构清晰,分点解释,引用提供的资料。例如,在窗口添加流程中提到PhoneWindow和WindowManagerImpl的分工,引用[1]。可能还需要提到系统服务初始化的部分,引用[4]中的内容。 另外,用户的问题可能涉及WMS的代码结构,比如WindowManagerService类的方法,如addWindow(),处理权限和窗口参数。这部分需要结合Android源码的结构,但用户可能不需要太深入的代码细节,而是整体流程。 最后,生成相关问题要考虑用户可能进一步想知道WMS与其他服务的交互、性能优化或窗口动画的实现。例如,WMS如何处理多窗口模式,或者与SurfaceFlinger的协作机制。</think>### Android窗口管理服务(WMS)实现细节 #### 1. **WMS的核心职责** - **窗口层级管理**:通过Z-order决定窗口的显示顺序,例如对话框始终位于应用主窗口之上。 - **布局计算**:根据窗口尺寸、位置和系统状态(如导航栏高度)计算最终可见区域。 - **输入事件路由**:将触摸事件分发到正确的窗口,基于窗口层级和焦点状态。 - **Surface分配**:通过SurfaceFlinger为每个窗口分配图形缓冲区,管理合成策略[^1][^4]。 #### 2. **窗口添加流程** ```java // 伪代码流程 1. ActivityThread.handleResumeActivity() → 2. WindowManagerImpl.addView() → 3. WindowManagerGlobal.addView() → 4. ViewRootImpl.setView() → 5. Session.addToDisplay()(跨进程调用WMS)→ 6. WMS.addWindow() ``` - **关键点**:应用通过`WindowManagerImpl`发起请求,最终由WMS在`system_server`进程中完成窗口注册[^4]。 #### 3. **窗口状态管理** - **数据结构**:使用`WindowState`对象跟踪每个窗口的: - 父/子窗口关系(如PopupWindow依附于Activity窗口) - 当前焦点状态 - Surface控制句柄 - **布局优化**:通过`performLayoutAndPlaceSurfacesLocked()`方法批量处理布局计算,减少重复计算。 #### 4. **跨进程通信机制** - **Binder接口**:`IWindowSession`用于应用进程向WMS发送请求 - **回调接口**:`IWindow`允许WMS向应用进程通知事件(如尺寸变化) ```java // WMS中的典型IPC调用 public int addWindow(Session session, IWindow client, ...) { // 权限检查(TYPE_SYSTEM_ALERT需MANAGE_APP_TOKENS权限) // 创建WindowToken关联ActivityRecord } ``` #### 5. **与图形系统的协作** - **Surface生命周期**: - WMS通过`SurfaceControl`创建/销毁Surface - Surface状态变化触发`SurfaceFlinger`图层重组 - **动画处理**:窗口动画由WMS计算帧数据,通过`Transaction.setMatrix()`提交到SurfaceFlinger。 #### 6. **特殊窗口处理** - **系统窗口**(如STATUS_BAR): - 在`PhoneWindowManager`中定义策略 - 拥有最高Z-order优先级 - **多窗口模式**: - Split-screen模式下重新计算各窗口边界 - 通过`ActivityTaskManager`协调任务栈
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值