1,Activity中有一個DecorView;android
2,DecorView是在PhoneWindow中;windows
2-1,PhoneWindow中有DecorView和mContentParent。mContentParent是DecorView或者是DecorView的子視圖;服務器
3,Activity的Window實際上是它的導出類PhoneWindow。它的生成過程是:PolicyManager中有一個IPolicy接口,它引用了Policy實例,在Policy實例中使用makeNewWindow返回PhoneWindow;session
4,DecorView是在PhoneWindow中new出來的;app
5,WindowManagerService中有一個內部類Session,Session繼承IWindowSession.Stub;this
6,WindowManager是一個接口;spa
7,WindowManagerImpl實現了WindowManager這個接口;code
7-1,WindowManagerImpl中組合了WindowManagerGlobal,而WindowManagerGlobal中有一個類型爲ArrayList<ViewRootImpl>的成員mRoots;對象
7-2,ViewRootImpl中有一個ViewRootHandler,它繼承Handler,接收了invalidate,resized等消息;繼承
7-3,ViewRootImpl中有一個Surface成員對象,Surface中有一個Canvas字段。而View繪製使用的Canvas便是這個Surface中的Canvas;
10,在android高版本中,WindowManager的建立與獲取是在ContextImpl的SYSTEM_SERVICE_MAP中實現的。SYSTEM_SERVICE_MAP是static的,因此推斷一個app中只有一個WindowManagerImpl實例。
11,那麼客戶端app是如何跟WindowManagerService取得聯繫的呢?在客戶端app這一邊,有一個WindowManagerGlobal類,WindowManagerGlobal類中有一個靜態方法getWindowSession,該靜態方法返回一個IWindowSession接口。再看ViewRootImpl類的構造方法,在該構造方法中經過使用WindowManagerGlobal的getWindowSession靜態方法,獲得一個IWindowSession接口,賦給mWindowSession。這樣能夠使用mWindowSession和WindowManagerService創建通訊;我發現我分析錯了,應該是這樣的。在客戶端app這一邊,有一個WindowManagerGlobal類,WindowManagerGlobal類有一個靜態方法getWindowManagerService。經過getWindowManagerService獲取到IWindowManager這個接口,並把它賦值給字段sWindowManagerService。那麼問題來了,mWindowSession是什麼做用呢?
11-1,window服務這一端有個Session類,它繼承了IWindowSession.Stub,這個類的對象在WindowManagerService類的openSession方法中建立,而且經過遠程機制把IWindowSession接口返回給客戶端,具體是WindowManagerGlobal的getWindowSession方法中把服務器端的IWindowSession接口賦給靜態字段sWindowSession。因而可知,一個app在WindowManagerService中對應一個Session對象;
11-2,在ViewRootImpl中有一個字段mWindow,它是W類。而這個W類是ViewRootImpl的靜態內部類,它繼承了IWindow.Stub,引用了ViewRootImpl和IWindowSession。這個W類的對象mWindow在ViewRootImpl的setView方法中以參數的形式傳遞給mWindowSession的addToDisplay。此時再來觀察Window服務端,在Session中的addToDisplay方法中,調用了WindowManagerService的addWindow方法。而在後面這個addWindow方法中,把客戶端這個W類的對象,以IWindow接口形式傳給了WindowState,進而保存在WindowManagerService的隊列中;
12,WindowManagerService繼承了IWindowManager.Stub;
13,那麼,WindowToken是什麼呢?從WindowState開始研究起。WindowState的構造方法中傳入了WindowToken;
14,在WindowManagerService中建立WindowState時,傳入一個token,該token從mTokenMap中得到。而mTokenMap是一個Map表,該Map表的key是IBinder類,Value是WindowToken。該IBinder是WindowState中的mClient,這個mClient是接口IWindow,這個IWindow是客戶端的W類。
15,在源代碼中對WindowToken的解釋以下所示。
/**
* Container of a set of related windows in the window manager. Often this
* is an AppWindowToken, which is the handle for an Activity that it uses
* to display windows. For nested windows, there is a WindowToken created for
* the parent window to manage its children.
*/
還有一些疑問列舉以下:
1,Activity組件在啓動完成後,會經過一個類型爲Session的Binder對象來請求WindowManagerService爲它建立一個類型爲WindowState的對象,用來描述它的窗口狀態。那麼問題是:如何經過session請求WindowManagerService的?
activity的類圖以下。
Activity中的window的類關係圖以下。