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

Activity是Android應用程序的載體,允許用戶在其上創建一個用戶界面,並提供用戶處理事件的API,如onKeyEvent, onTouchEvent等。 並維護應用程序的生命週期。Activity本身是個龐大的載體,可以理解成是應用程序的載體,如果木有Activity,android應用將無法運行。也可以理解成android應用程序的入口。Acivity的實例對象由系統維護。系統服務ActivityManager負責維護Activity的實例對象,並根據運行狀態維護其狀態信息。

 

當我們調用Acitivity的 setContentView方法的時候實際上是調用的Window對象的setContentView方法,所以我們可以看出Activity中關於界面的繪製實際上全是交給Window對象來做的。繪製類圖的話,可以看出Activity聚合了一個Window對象。

 

在該方法中,首先創建一個DecorView,DecorView是一個擴張FrameLayout的類,是所有窗口的根View。我們在Activity中調用的setConctentView就是放到DecorView中了。這是我們類圖的聚合關係如下:

Activity--->Window--->DecorView

 

Activity創建後系統會調用其attach方法,將其添加到ActivityThread當中,在attach方法中創建了一個window對象。window對象是一個抽象類。要注意window對象創建時並木有創建Decor對象。用戶在Activity中調用setContentView,然後調用window的setContentView,這時會檢查DecorView是否存在,如果不存在則創建DecorView對象,然後把用戶自己的View 添加到DecorView中。

 

在ActivityThread當中調用wm.addView(decor, l);把它加入到window manager proxy的mViews中,同時爲這個decor view創建一個ViewRoot,ViewRoot負責協調decorview與windowmanager直接繪圖、事件處理。說簡單點就是DecorView是客戶端所有view的根,window manager proxy爲這個decorview創建一個ViewRoot和Window manager service打交道

 

我們可以去看看DecorView的實現,它是PhoneWindow的一個內部類。實現很簡單,它默認會包含一個灰色的標題欄,然後在標題欄下邊會包含一個空白區域用來當用戶調用setContentView的時候放置用戶View,並傳遞事件。


================================================================================================

1、Activity , Window和View的關係是什麼?

跟蹤Activity的源碼就會發現:
Activity.attch() -> PolicyManager -> Policy -> PhoneWindow -> mLayoutInflater.inflate()&mContentParent.addView()
這只是一個簡單的跟蹤過程描述。通過跟蹤源代碼,就可以很清晰的看出他們三者的關係。 

Activity像一個工匠(控制單元),Window像窗戶(承載模型),View像窗花(顯示視圖)
LayoutInflater像剪刀,Xml配置像窗花圖紙。

1)一個Activity構造的時候會初始化一個Window,準確的說是PhoneWindow。
2)這個PhoneWindow有一個“ViewRoot”,引號是說其實這個“ViewRoot”是一個View或者說ViewGroup,是最初始的根視圖。
3)“ViewRoot”通過addView方法來一個個的添加View。比如TextView,Button等
4)這些View的事件監聽,是由WindowManagerService來接受消息,並且回調Activity函數。比如onClickListener,onKeyDown等

發佈了9 篇原創文章 · 獲贊 11 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章