Android 內核 - 03 創建應用窗口 和 子窗口

Android 的窗口分三類,應用窗口,子窗口,系統窗口,這裏整理的是應用窗口子窗口的創建。

應用窗口

每個Activity會對應着一個窗口。
應用窗口的創建,相當於是 Activity,Window(PhoneWindow), WindowManager,WindowManagerImpl,和 View相互關聯,
並建立互動的一個過程。可以把這個過程分成兩個部分,初始化設置與View關聯這裏分成兩個部分只爲了理解方便,但整個過程還是一個完整的一氣呵成過程並沒有分開。

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

pic_01


關聯View階段
主要工作在 Activity,WindowManager,WindowManagerImpl, WindowManagerGlobal 和 View中。
這裏WindowManagerGlobal 是執行者。View類和ViewRootImpl類中有很多的內容,可以單獨分析整理。 這裏只是保留了調用接口調用的信息。

pic_02

子窗口


對於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);
                }
            }
         }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章