Android 的窗口分三類,應用窗口,子窗口,系統窗口,這裏整理的是應用窗口和子窗口的創建。
應用窗口
每個Activity會對應着一個窗口。
應用窗口的創建,相當於是 Activity,Window(PhoneWindow), WindowManager,WindowManagerImpl,和 View相互關聯,
並建立互動的一個過程。可以把這個過程分成兩個部分,初始化設置和與View關聯。這裏分成兩個部分只爲了理解方便,但整個過程還是一個完整的一氣呵成過程並沒有分開。
初始化設置階段
主要工作在 Activity,Window(PhoneWindow)中。用圖的方式更好理解。
關聯View階段
主要工作在 Activity,WindowManager,WindowManagerImpl, WindowManagerGlobal 和
View中。
這裏WindowManagerGlobal
是執行者。View類和ViewRootImpl類中有很多的內容,可以單獨分析整理。 這裏只是保留了調用接口調用的信息。
子窗口
對於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);
}
}
}