1. 程式人生 > >android 中View, Window, Activity, WindowManager,ViewRoot幾者之間的關系

android 中View, Window, Activity, WindowManager,ViewRoot幾者之間的關系

line 消息傳遞 post att 顯示 增加 調用 eas window對象

(1)View:最主要的UI組件,表示屏幕上的一個矩形區域。



(2)Window: 表示一個窗體,不一定有屏幕那麽大,能夠非常大也能夠非常小;
它包括一個View tree和窗體的layout 參數。
View tree的root View能夠通過getDecorView得到。還能夠設置Window的Content View。

(3)Activity:Activity包括一個Window。該Window在Activity的attach方法中通過調用
PolicyManager.makeNewWindo創建

(4)WindowManager:一個interface。繼承自ViewManager。

有一個implementation

(5)class:android.view.WindowManagerImpl

事實上WindowManager並非整個系統的窗體管理器,而是所在應用進程的窗體管理器。系統全局的窗體管理器執行在SystemServer進程中,是一個Service。

ViewRoot通過IWindowSession接口與全局窗體管理器進行交互。

將一個View add到WindowManager時。WindowManagerImpl創建一個ViewRoot來管理該窗體的根View。並通過ViewRoot.setView方法把該View傳給ViewRoot。

ViewRoot用於管理窗體的根View,並和global window manger進行交互。ViewRoot中有一個nested class: W。W是一個Binder子類,用於接收global window manager的各種消息, 如按鍵消息, 觸摸消息等。 ViewRoot有一個W類型的成員mWindow,ViewRoot在Constructor中創建一個W的instance並賦值給mWindow。 ViewRoot是Handler的子類。 W會通過Looper把消息傳遞給ViewRoot。

ViewRoot在setView方法中把mWindow傳給sWindowSession。



ActivityThread.java中調用wm.addView(decor, l);把它增加到window manager
proxy的mViews中。同一時候為這個decor view創建一個ViewRoot,ViewRoot負責協調decor view與window
manager直接畫圖、事件處理。

ViewRoot中有IWindowSession和IWindow用來和window manger打交道和接收window
manager傳過來的消息。消息傳過來後ViewRoot分發給decor view,再由decor view進行分發



總之,每一個窗體相應著一個Window對象,一個根View和一個ViewRoot對象。要想創建一個窗體,能夠調用
WindowManager的addView方法。作為參數的view將作為在該窗體上顯示的根view

一般來講,Activity就是一 個可視的人機交互界面。
每個Activity都有一個默認的Window。一 般來講。這個Window都是全屏的,當然也有例外。比方Dialog的Window就是非全屏的。Activity也能夠利用默認Window以外的其 它的Window。比方彈出一個Dialog對話框。

6 i8 J‘ I‘ b+ v. F% r
Window裏可見的內容,就是一層一層的View。Window裏的View是通過 setContentView這個接口set進去的,這個ContentView就是Window裏處於最根部的View。

對於屏幕顯示而 言,整個是Activity 事實上確切的說是window,為什麽這樣說呢?

在Activityattach 函數裏.有這樣一句 mWindow = PolicyManager.makeNewWindow(this);

這句是把Activiyt window關聯起來了.真正關聯的是PhoneWindow.

這個window裏顯示的東西是view(activity是邏輯上的東 西,添加了生命周期管理等. 裏面詳細的東西也是view。並且啟動activity的實現也是往window裏加view),往window裏加view,是通過調用 WindowManager(WindowManagerImpl).addView()來實現的。



為什麽能夠這樣說呢?

看public void setContentView(int layoutResID) {
getWindow().setContentView(layoutResID);
}


在 addView裏。會為每一個view創建一個viewRoot(這是邏輯上的東西,用來負責view的事件處理和邏輯處理。並和 WindowsManagerService建立聯系),而在WindowManagerImpl裏,會維護viewRoot的數組。

最 終會調用ViewRoot.setView(),在setView裏會顯示該view等。在setView的實現裏。會調用Session.add()來 addWindow,通過這種方法。會將ViewRoot和WindowManagerService聯系起來(比方說分發事件等),而且這種方法裏會調 用PhoneWindowManager.prepareAddWindowLw()。

這僅僅是模糊概念。還有細節須要推敲,我會繼續努 力.假設你感覺是這麽會事。你得給我頂了,我也不easy的.都非常辛苦啊.



android 中View, Window, Activity, WindowManager,ViewRoot幾者之間的關系