“窗口”是一個抽象的概念,從用戶角度來講,它是一個“界面”;從 SurfaceFlinger 角度來看,它是一個 Layer,承載著和“界面”有關(guān)的數(shù)據(jù)和屬性;從 WMS 的角度來看,它是一個 WindowState,用于管理和“界面”有關(guān)的狀態(tài)。
打個比方,就像一出由N個演員參與的話劇:SurfaceFlinger 是攝像機,WMS 是導(dǎo)演,ViewRoot 則是演員個體。攝像機(SurfaceFlinger)的作用是單一而規(guī)范的,它負(fù)責(zé)客觀地捕獲當(dāng)前的畫面,然后真實地呈現(xiàn)給觀眾;導(dǎo)演(WMS)則會考慮到話劇的舞臺效果和視覺美感,如他需要根據(jù)實際情況來安排各個演員的排序站位,誰在前誰在后,都會影響到演出的“畫面效果”與“劇情編排”;而各個演員(ViewRoot)的長相和表情,則更多地取決于他們自身的條件和努力。
從計算機 I/O 系統(tǒng)的角度來分析,WMS 至少要完成以下兩個功能:
- 全局的窗口管理(Output)
應(yīng)用程序的顯示請求在 SurfaceFlinger 和 WMS 的協(xié)助下有序地輸出給物理屏幕或者其他顯示設(shè)備。
- 全局的事件管理派發(fā)(Input)
SurfaceFlinger 只做與“顯示”相關(guān)的事情,WMS 還要“兼職”對輸入事件的派發(fā)。
10.1 WMS,AMS 與 Activity 間的關(guān)系
10.2 窗口屬性
窗口類型(Type):
- Application Window:1-99
- Sub Window:1000-1999
- System Window:2000-2999
層級(BaseLayer):
通過 windowTypeToLayerLw 函數(shù)對不同的窗口類型進行簡單映射,映射規(guī)則取決于設(shè)備所采用的 WindowManagerPolicy。
Window Policy 即窗口策略,代表了 Android 顯示系統(tǒng)所遵循的統(tǒng)一的窗口顯示規(guī)則。
窗口屬性:
窗口屬性統(tǒng)一放置在 WindowManager.LayoutParams 中,有如下幾個重要變量:
- Type
- Flags
- systemUiVisibility
10.3 窗口的添加過程
10.4 Surface管理
Surface 申請流程(relayout)
WMS 原則上只負(fù)責(zé)管理“窗口”的層級和屬性,而 SurfaceFlinger 才是真正將窗口數(shù)據(jù)合成并最終顯示到屏幕上的系統(tǒng)服務(wù)。
Surface 的跨進程傳遞
Surface(Java)對象在兩個地方會被創(chuàng)建:
ViewRootImp:對應(yīng)的是 ViewRootImp 的成員變量 mSurface,而且它在一開始就分配了一個“空”的 Surface 對象。
WindowStateAnimator:當(dāng) WMS 調(diào)用 WindowStateAnimator 的 createSurfaceLocked 時,將生成一個真正有效的 Surface 對象,且由其成員變量 mSurfaceControl 管理。
10.5 performLayoutAndPlaceSurfacesLockedinner
從函數(shù)名大概可以猜出它的設(shè)計意圖,即 Perfrom Layout 和 Place Surface。Layout 在這里側(cè)重表達的是“尺寸大小”的意思,即每個窗口所占的空間;后者則與 SurfaceFlinger 有關(guān) -- WMS 是“導(dǎo)演”,它需要將自己的意圖告訴“攝影機”(Surface)。
10.6 窗口大小的計算過程
SYSTEM_UI_FLAG_FULLSCREEN:用戶要求全屏。
SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:“假設(shè)”當(dāng)前已經(jīng)是全屏。
10.7 啟動窗口的添加和銷毀
10.8 窗口動畫
窗口動畫類型
AppWindowAnimator:AppWindowToken 中的成員變量 mAppAnimator 即代表了此應(yīng)用程序所屬的 AppWindowAnimator 動畫。
WindowStateAnimator:WindowManagerService 記錄了所有窗口的 WindowState,其中 WindowState.mWinAnimator 是一個 WindowStateAnimator 對象。它和上面的 AppWindowAnimator 一樣都是可以由應(yīng)用開發(fā)人員自行定制的。
ScreenRotationAnimator:屏幕旋轉(zhuǎn)動畫。WindowManagerService 中的 mAnimator 是一個 WindowAnimator 類型的對象,其中 WindowAnimator.mScreenRorationAnimation 即屏幕旋轉(zhuǎn)動畫。
動畫流程追蹤--WindowStateAnimator
1.獲取對應(yīng)的動畫id
2.加載動畫
3.設(shè)置動畫
AppWindowAnimator
當(dāng)啟動一個新的 Activity 時,AMS 會根據(jù)當(dāng)前的實際情況來判斷是否為應(yīng)用程序設(shè)置 AppWindowAnimator 以及動畫的類型。