android UI結構 (2)ViewRoot的橋樑作用

yangxi_001發表於2013-11-20

ViewRoot這個類在android的UI結構中扮演的是一箇中間者的角色,連線的是PhoneWindow跟WindowManagerService.

WindowManagerService中我們知道它讀取android系統裡所有事件,鍵盤事件,軌跡球事件等等,它怎麼分發到各個activity的呢?就是通過這個ViewRoot。

在每個PhoneWindow建立的時候,系統都會向WindowManger中的一個儲存View陣列增加PhoneWindow的DecorView物件,WindowManger在儲存好這個View物件的同時,也會新建立一個ViewRoot物件用來溝通WindowManagerService。

可以檢視WindowManagerImpl跟ViewRoot中的程式碼,同時ViewRoot中我們可以看到一個W型別,該型別派生自IWindow.stub可以知道這個可以被用來作遠端呼叫。

res = sWindowSession.add(mWindow, mWindowAttributes,

getHostVisibility(), mAttachInfo.mContentInsets);

IwindowSession則是WindowManagerService中的遠端呼叫介面,上述程式碼也表明了每建立了一個PhoneWindow,也就建立了一個ViewRoot,並將在WindowManagerService註冊。

接下來簡單的看下KeyEvent的傳遞。在WindowManagerService中

focus.mClient.dispatchKey(event);

這個段程式碼的mClient則就是ViewRoot中的W型別,通過遠端呼叫,可以看看ViewRoot的處理:

boolean handled = mView != null

? mView.dispatchKeyEventPreIme(event) : true;

mView則是PhoneWindow的DecorView物件,接下來怎麼具體傳遞可以慢慢去跟了。。。

相關文章