Android 内核 - 03 创建应用窗口 和 子窗口

Android 的窗口分三类,应用窗口,子窗口,系统窗口,这里整理的是 应用窗口子窗口的创建。

应用窗口

每个Activity会对应着一个窗口。
应用窗口的创建,相当于是 Activity,Window(PhoneWindow), WindowManager,WindowManagerImpl,和 View相互关联,
并建立互动的一个过程。可以把这个过程分成两个部分, 初始化设置与View关联这里分成两个部分只为了理解方便,但整个过程还是一个完整的一气呵成过程并没有分开。

初始化设置阶段
主要工作在 Activity,Window(PhoneWindow)中。用图的方式更好理解。

Android 内核 - 03 创建应用窗口 和 子窗口_第1张图片


关联View阶段
主要工作在 Activity,WindowManager,WindowManagerImpl, WindowManagerGlobal 和 View中。
这里 WindowManagerGlobal 是执行者。View类和ViewRootImpl类中有很多的内容,可以单独分析整理。  这里只是保留了调用接口调用的信息。

Android 内核 - 03 创建应用窗口 和 子窗口_第2张图片

子窗口


对于Wms来说,应用窗口和子窗口的创建过程并没有太大区别,他们本质的区别是各自属性上的不一样。

这里主要是在WindowManagerGlobal.addView()方法中关于子窗口,有些特别的处理。

取得当前layout参数,并判断 parentWindow是否为空,然后对子窗口进行处理。

        final WindowManager.LayoutParams wparams = (WindowManager.LayoutParams)params;
        if (parentWindow != null) {
            parentWindow.adjustLayoutParamsForSubWindow(wparams);
        }


判断 窗口类型是在 FIRST_SUB_WINDOW 和  LAST_SUB_WINDOW之间

        // If this is a panel window, then find the window it is being
        // attached to for future reference.
        if (wparams. type >= WindowManager.LayoutParams. FIRST_SUB_WINDOW &&
                    wparams. type <= WindowManager.LayoutParams. LAST_SUB_WINDOW
        {
            final int count = mViews.size();
            for (int i = 0; i < count; i++) {
                if (mRoots.get(i).mWindow.asBinder() == wparams.token) 
                {
                        panelParentView = mViews.get(i);
                }
            }
         }


你可能感兴趣的:(Android 内核 - 03 创建应用窗口 和 子窗口)