原文出處——>[Android窗口管理服務WindowManagerService的簡要介紹和學習計劃](http://blog.csdn.net/luoshengyang/article/details/8462738)
在前一個系列文章中,我們從個體的角度來分析了Android應用程序窗口的實現框架。事實上,如果我們從整體的角度來看,Android應用程序窗口的實現要更復雜,因為它們的類型和作用不同,且會相互影響。在Android系統中,對系統中的所有窗口進行管理是窗口管理服務WindowManagerService的職責。在本文中,我們就將簡要介紹WindowManagerService的職能以及制定學習計劃。
我們知道,在Android系統中,同一時刻,只有一個Activity窗口是激活的,但是,對于WindowManagerService服務來說,這并不意味著它每次只需要管理一個Activity窗口,例如,在兩個Activity窗口的切換過程中,前后兩個Activity窗口實際上都是可見的。即使在只有一個Activity窗口是可見的時候,WindowManagerService服務仍然需要同時管理著多個窗口,這是因為可見的Activity窗口可能還會被設置了壁紙窗口(Wallpaper Winodw)或者彈出了子窗口(Sub Window),以及可能會出現狀態欄(Status Bar)以及輸入法窗口(Input Method Window),如圖1所示。
:-: 
圖1 Activity窗口及其子窗口、壁紙窗口、輸入法窗口和狀態欄的位置結構
因此,WindowManagerService服務是不可以假設同一時刻它只需要管理一個窗口的,它需要通過各個窗口在屏幕上的位置以及大小來決定哪些窗口需要顯示的以及要顯在哪里,這實際上就是要計算出各個窗口的可見區域。
從前面Android系統Surface機制的SurfaceFlinger服務渲染應用程序UI的過程分析一文可以知道,SurfaceFlinger服務在渲染整個屏幕的UI的時候,會對各個窗品的可見性進行計算,因此,WindowManagerService服務只要將它所管理的各個窗品的位置以及大小告訴SurfaceFlinger服務,后者可以幫幫它計算出各個窗口的可見區域了。注意,這里,這里所說的窗口位置包括窗口在X、Y和Z軸的位置。
WindowManagerService服務大致按照以下方式來控制哪些窗口需要顯示的以及要顯在哪里:
1. 每一個Activity窗口的大小都等于屏幕的大小,因此,只要對每一個Activity窗口設置一個不同的Z軸位置,然后就可以使得位于最上面的,即當前被激活的Activity窗口,才是可見的。
2. 每一個子窗口的Z軸位置都比它的父窗口大,但是大小要比父窗口小,這時候Activity窗口及其所彈出的子窗口都可以同時顯示出來。
3. 對于非全屏Activity窗口來說,它會在屏幕的上方留出一塊區域,用來顯示狀態欄。這塊留出來的區域稱對于屏幕來說,稱為裝飾區(decoration),而對于Activity窗口來說,稱為內容邊襯區(Content Inset)。
4. 輸入法窗口只有在需要的時候才會出現,它同樣是出現在屏幕的裝飾區或者說Activity窗口的內容邊襯區的。
5. 對于壁紙窗口,它出現需要壁紙的Activity窗口的下方,這時候要求Activity窗口是半透明的,這樣就可以將它后面的壁紙窗口一同顯示出來。
6. 兩個Activity窗口在切換過程,實際上就是前一個窗口顯示退出動畫而后一個窗口顯示開始動畫的過程,而在動畫的顯示過程,窗口的大小會有一個變化的過程,這樣就導致前后兩個Activity窗口的大小不再都等于屏幕的大小,因而它們就有可能同時都處于可見的狀態。事實上,Activity窗口的切換過程是相當復雜的,因為即將要顯示的Activity窗口可能還會被設置一個啟動窗口(Starting Window)。一個被設置了啟動窗口的Activity窗口要等到它的啟動窗口顯示了之后才可以顯示出來。
從以上六點就可以看出,窗口在X、Y和Z軸的位置及其大小的計算非常重要,它們共同決定了一個窗口是否是整體可見的,還是部分可見的,或者整體不可見的。在Android系統中,WindowManagerService服務是通過一個實現了WindowManagerPolicy接口的策略類來計算一個窗口的位置和大小的。例如,在Phone平臺上,這個策略類就是PhoneWindowManager。這樣做的好處就是對于不同的平臺實現不同的策略類來達到不同的窗口控制模式。
從上面的描述就可以看出,WindowManagerService服務除了要與Activity窗口所運行在的應用程序進程打交道之外,還需要與SurfaceFlinger服務以及窗口管理策略類PhoneWindowManager交互,如圖2所示。
:-: 
圖2 WindowManagerService服務與Activity窗口、SurfaceFlinger服務、PhoneWindowManager策略的關系圖
在前面Android應用程序窗口(Activity)實現框架簡要介紹和學習計劃的一系列文章中,我們已經分析過應用程序進程與WindowManagerService服務之間的交互過程了,因此,在這一系列文章中,我們就將主要分析WindowManagerService服務的實現,以及它與SurfaceFlinger服務、PhoneWindowManager策略類的交互過程。
從總體上來看,WindowManagerService服務的實現是相當復雜的,例如,WindowManagerService類的核心成員函數performLayoutAndPlaceSurfacesLockedInner的代碼有1200+行,比600-行代碼的ViewRoot類的核心成員函數performTraversals還要恐怖。不過,WindowManagerService服務實現的復雜性是在預料之中的,畢竟它要管理的整個系統所有窗口的UI,而在任何一個系統中,窗口管理子系統都是極其復雜的。基于上述理由,采用硬碰硬的方式來分析WindowManagerService服務的實現是以卵擊石,因此,這個系列的文章將對WindowManagerService服務進行分拆,然后再逐個擊破,這是算法中的分而治之思想是一致的。
具體來說,我們將按照以下幾個情景來分析WindowManagerService服務的實現:
1. 窗口大小和位置(X軸和Y軸)的計算過程。
2. 窗口的組織方式。
3. 輸入法窗口的調整過程。
4. 壁紙窗口的調整過程。
5. 窗口Z軸位置的計算和調整過程。
6. Activity窗口的啟動窗口的顯示過程。
7. Activity窗口的切換過程。
8. Activity窗口的動畫顯示過程。
再次地,由于WindowManagerService服務的實現實在是太復雜,因此上述八個情景可能還不足于說明WindowManagerService服務的實現。如果出現這種情況,我們在分析的過程中會進行相應的調整。相信對WindowManagerService服務的實現進行分而治之的分析后,我們就可以對Android系統的UI架構有一個深刻的理解!敬請關注接下來的文章!
- 前言
- Android組件設計思想
- Android源代碼開發和調試環境搭建
- Android源代碼下載和編譯
- Android源代碼情景分析法
- Android源代碼調試分析法
- 手把手教你為手機編譯ROM
- 在Ubuntu上下載、編譯和安裝Android最新源代碼
- 在Ubuntu上下載、編譯和安裝Android最新內核源代碼(Linux Kernel)
- 如何單獨編譯Android源代碼中的模塊
- 在Ubuntu上為Android系統編寫Linux內核驅動程序
- 在Ubuntu上為Android系統內置C可執行程序測試Linux內核驅動程序
- 在Ubuntu上為Android增加硬件抽象層(HAL)模塊訪問Linux內核驅動程序
- 在Ubuntu為Android硬件抽象層(HAL)模塊編寫JNI方法提供Java訪問硬件服務接口
- 在Ubuntu上為Android系統的Application Frameworks層增加硬件訪問服務
- 在Ubuntu上為Android系統內置Java應用程序測試Application Frameworks層的硬件服務
- Android源代碼倉庫及其管理工具Repo分析
- Android編譯系統簡要介紹和學習計劃
- Android編譯系統環境初始化過程分析
- Android源代碼編譯命令m/mm/mmm/make分析
- Android系統鏡像文件的打包過程分析
- 從CM刷機過程和原理分析Android系統結構
- Android系統架構概述
- Android系統整體架構
- android專用驅動
- Android硬件抽象層HAL
- Android應用程序組件
- Android應用程序框架
- Android用戶界面架構
- Android虛擬機之Dalvik虛擬機
- Android硬件抽象層
- Android硬件抽象層(HAL)概要介紹和學習計劃
- Android專用驅動
- Android Logger驅動系統
- Android日志系統驅動程序Logger源代碼分析
- Android應用程序框架層和系統運行庫層日志系統源代碼分析
- Android日志系統Logcat源代碼簡要分析
- Android Binder驅動系統
- Android進程間通信(IPC)機制Binder簡要介紹和學習計劃
- 淺談Service Manager成為Android進程間通信(IPC)機制Binder守護進程之路
- 淺談Android系統進程間通信(IPC)機制Binder中的Server和Client獲得Service Manager接口之路
- Android系統進程間通信(IPC)機制Binder中的Server啟動過程源代碼分析
- Android系統進程間通信(IPC)機制Binder中的Client獲得Server遠程接口過程源代碼分析
- Android系統進程間通信Binder機制在應用程序框架層的Java接口源代碼分析
- Android Ashmem驅動系統
- Android系統匿名共享內存Ashmem(Anonymous Shared Memory)簡要介紹和學習計劃
- Android系統匿名共享內存Ashmem(Anonymous Shared Memory)驅動程序源代碼分析
- Android系統匿名共享內存Ashmem(Anonymous Shared Memory)在進程間共享的原理分析
- Android系統匿名共享內存(Anonymous Shared Memory)C++調用接口分析
- Android應用程序進程管理
- Android應用程序進程啟動過程的源代碼分析
- Android系統進程Zygote啟動過程的源代碼分析
- Android系統默認Home應用程序(Launcher)的啟動過程源代碼分析
- Android應用程序消息機制
- Android應用程序消息處理機制(Looper、Handler)分析
- Android應用程序線程消息循環模型分析
- Android應用程序輸入事件分發和處理機制
- Android應用程序鍵盤(Keyboard)消息處理機制分析
- Android應用程序UI架構
- Android系統的開機畫面顯示過程分析
- Android幀緩沖區(Frame Buffer)硬件抽象層(HAL)模塊Gralloc的實現原理分析
- SurfaceFlinger
- Android系統Surface機制的SurfaceFlinger服務
- SurfaceFlinger服務簡要介紹和學習計劃
- 啟動過程分析
- 對幀緩沖區(Frame Buffer)的管理分析
- 線程模型分析
- 渲染應用程序UI的過程分析
- Android應用程序與SurfaceFlinger服務的關系
- 概述和學習計劃
- 連接過程分析
- 共享UI元數據(SharedClient)的創建過程分析
- 創建Surface的過程分析
- 渲染Surface的過程分析
- Android應用程序窗口(Activity)
- 實現框架簡要介紹和學習計劃
- 運行上下文環境(Context)的創建過程分析
- 窗口對象(Window)的創建過程分析
- 視圖對象(View)的創建過程分析
- 與WindowManagerService服務的連接過程分析
- 繪圖表面(Surface)的創建過程分析
- 測量(Measure)、布局(Layout)和繪制(Draw)過程分析
- WindowManagerService
- WindowManagerService的簡要介紹和學習計劃
- 計算Activity窗口大小的過程分析
- 對窗口的組織方式分析
- 對輸入法窗口(Input Method Window)的管理分析
- 對壁紙窗口(Wallpaper Window)的管理分析
- 計算窗口Z軸位置的過程分析
- 顯示Activity組件的啟動窗口(Starting Window)的過程分析
- 切換Activity窗口(App Transition)的過程分析
- 顯示窗口動畫的原理分析
- Android控件TextView的實現原理分析
- Android視圖SurfaceView的實現原理分析
- Android應用程序UI硬件加速渲染
- 簡要介紹和學習計劃
- 環境初始化過程分析
- 預加載資源地圖集服務(Asset Atlas Service)分析
- Display List構建過程分析
- Display List渲染過程分析
- 動畫執行過程分析
- Android應用程序資源管理框架
- Android資源管理框架(Asset Manager)
- Asset Manager 簡要介紹和學習計劃
- 編譯和打包過程分析
- Asset Manager的創建過程分析
- 查找過程分析
- Dalvik虛擬機和ART虛擬機
- Dalvik虛擬機
- Dalvik虛擬機簡要介紹和學習計劃
- Dalvik虛擬機的啟動過程分析
- Dalvik虛擬機的運行過程分析
- Dalvik虛擬機JNI方法的注冊過程分析
- Dalvik虛擬機進程和線程的創建過程分析
- Dalvik虛擬機垃圾收集機制簡要介紹和學習計劃
- Dalvik虛擬機Java堆創建過程分析
- Dalvik虛擬機為新創建對象分配內存的過程分析
- Dalvik虛擬機垃圾收集(GC)過程分析
- ART虛擬機
- Android ART運行時無縫替換Dalvik虛擬機的過程分析
- Android運行時ART簡要介紹和學習計劃
- Android運行時ART加載OAT文件的過程分析
- Android運行時ART加載類和方法的過程分析
- Android運行時ART執行類方法的過程分析
- ART運行時垃圾收集機制簡要介紹和學習計劃
- ART運行時Java堆創建過程分析
- ART運行時為新創建對象分配內存的過程分析
- ART運行時垃圾收集(GC)過程分析
- ART運行時Compacting GC簡要介紹和學習計劃
- ART運行時Compacting GC堆創建過程分析
- ART運行時Compacting GC為新創建對象分配內存的過程分析
- ART運行時Semi-Space(SS)和Generational Semi-Space(GSS)GC執行過程分析
- ART運行時Mark-Compact( MC)GC執行過程分析
- ART運行時Foreground GC和Background GC切換過程分析
- Android安全機制
- SEAndroid安全機制簡要介紹和學習計劃
- SEAndroid安全機制框架分析
- SEAndroid安全機制中的文件安全上下文關聯分析
- SEAndroid安全機制中的進程安全上下文關聯分析
- SEAndroid安全機制對Android屬性訪問的保護分析
- SEAndroid安全機制對Binder IPC的保護分析
- 從NDK在非Root手機上的調試原理探討Android的安全機制
- APK防反編譯
- Android視頻硬解穩定性問題探討和處理
- Android系統的智能指針(輕量級指針、強指針和弱指針)的實現原理分析
- Android應用程序安裝過程源代碼分析
- Android應用程序啟動過程源代碼分析
- 四大組件源代碼分析
- Activity
- Android應用程序的Activity啟動過程簡要介紹和學習計劃
- Android應用程序內部啟動Activity過程(startActivity)的源代碼分析
- 解開Android應用程序組件Activity的"singleTask"之謎
- Android應用程序在新的進程中啟動新的Activity的方法和過程分析
- Service
- Android應用程序綁定服務(bindService)的過程源代碼分析
- ContentProvider
- Android應用程序組件Content Provider簡要介紹和學習計劃
- Android應用程序組件Content Provider應用實例
- Android應用程序組件Content Provider的啟動過程源代碼分析
- Android應用程序組件Content Provider在應用程序之間共享數據的原理分析
- Android應用程序組件Content Provider的共享數據更新通知機制分析
- BroadcastReceiver
- Android系統中的廣播(Broadcast)機制簡要介紹和學習計劃
- Android應用程序注冊廣播接收器(registerReceiver)的過程分析
- Android應用程序發送廣播(sendBroadcast)的過程分析