Framework 窗口添加流程分析2之 addWindow 流程

本文详细探讨了Android Framework中WindowManagerService.addWindow()的流程,包括权限检查、Display管理和WindowState创建。此外,还涉及了窗口类型判断、InputChannel注册、SurfaceSession的建立以及窗口过渡动画和屏幕显示边界的处理。
摘要由CSDN通过智能技术生成

Framework 窗口添加流程分析2之 addWindow 流程

以下是 WindowManagerService.addWindow() 方法的一些大致流程:

  1. 添加窗口的权限检查
  2. Display、DisplayContent 的检查及创建
  3. 处理一些要窗口类型的判断及 WindowToken 的判断创建
  4. 创建 WindowState ,传入 wms、IWindow、WindowToken、parentWindow、LayoutParams等参数
  5. 在 DisplayPolicy 处理窗口的一些策略,如焦点处理,保存状态栏、导航栏实例等
  6. 注册一个输入通道 InputChannel,以便可以处理输入事件
  7. win.attach() :维护当前 wms 的 Sessions 列表,并未 Session 创建 SurfaceSession,用于与 Surface Flinger 的连接,可以从中创建一个或多个 Surface 实例,而这些 Surface 实例将被合成到屏幕上
  8. win.mToken.addWindow(win) : WindowToken 容器的关系维护,参考 WindowContainer.addChild()
  9. 处理窗口过渡动画的添加
  10. 处理屏幕显示边界计算
  11. 输入相关的处理
  12. 更新屏幕旋转方向以及一些显示器相关的配置
// frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
public int addWindow(Session session, IWindow client, int seq,
                     LayoutParams attrs, int viewVisibility, int displayId, Rect outFrame,
                     Rect outContentInsets, Rect outStableInsets, Rect outOutsets,
                     DisplayCutout.ParcelableWrapper outDisplayCutout, InputChannel outInputChannel,
                     InsetsState outInsetsState) {
   
    int[] appOp = new int[1];
    // 添加窗口的权限检查,主要交给 WindowManagerPolicy 处理,实现类是 PhoneWindowManager
    int res = mPolicy.checkAddPermission(attrs, appOp);
    if (res != WindowManagerGlobal.ADD_OKAY) {
   
        return res;
    }
    boolean reportNewConfig = false;
    WindowState parentWindow = null;
    long origId;
    final int callingUid = Binder.getCallingUid();
    final int type = attrs.type;
    synchronized (mGlobalLock) {
   
        // frameworks/base/services/java/com/android/server/SystemServer.java
        // SystemServer 在 startOtherServices() 中创建 wms, 依次调用 wm.onInitReady()、wm.displayReady()、wm.systemReady(), 其中在 wm.displayReady() 后 mDisplayReady 置为 true
        if (!mDisplayReady) {
   
            throw new IllegalStateException("Display has not been initialialized");
        }
        // 获取 DisplayContent
        final DisplayContent displayContent = getDisplayContentOrCreate(displayId, attrs.token);

        if (displayContent == null) {
   
            // 创建失败
            Slog.w(TAG_WM, "Attempted to add window to a display that does not exist: "
                   + displayId + ".  Aborting.");
            return WindowManagerGlobal.ADD_INVALID_DISPLAY;
        }

        if (!displayContent.hasAccess(session.mUid)) {
   
            Slog.w(TAG_WM, "Attempted to add window to a display for which the application "
                   + "does not have access: " + displayId + ".  Aborting.");
            return WindowManagerGlobal.ADD_INVALID_DISPLAY;
        }
        // 判断是否添加过该窗口, mWindowMap 保存已添加过的窗口
        if (mWindowMap.containsKey(client.asBinder()<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值