android:Activity、View和Window的關係(一)

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

(2)Window: 表示一個窗口,不一定有屏幕那麼大,可以很大也可以很小;
它包含一個View tree和窗口的layout 參數。
View tree的root View可以通過getDecorView得到。還可以設置Window的ContentView。

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

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

(5)class:android.view.WindowManagerImpl

其實WindowManager並不是整個系統的窗口管理器,而是所在應用進程的窗口管理器。系統全局的窗口管理器運行在SystemServer進程中,是一個Service。

ViewRoot通過IWindowSession接口與全局窗口管理器進行交互。 將一個Viewadd到WindowManager時,WindowManagerImpl創建一個ViewRoot來管理該窗口的根View。並通過ViewRoot.setView方法把該View傳給ViewRoot。

ViewRoot用於管理窗口的根View,並和global window manger進行交互。ViewRoot中有一個nestedclass: 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);把它加入到windowmanager
proxy的mViews中,同時爲這個decor view創建一個ViewRoot,ViewRoot負責協調decorview與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()。

這只是模糊概念,還有細節需要推敲,我會繼續努力.如果你感覺是這麼會事,你得給我頂了,我也不容易的.都很辛苦啊.
發佈了9 篇原創文章 · 獲贊 11 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章