Android控件架構

         android中的控件可以分爲2類,分別是View、ViewGroup。而ViewGroup中又可以包含其他子View和子ViewGroup。通過ViewGroup整個界面就形成了一個樹形結構。就是我們說的控件樹。上層父控件負責下層子控件的測量和繪製、佈局。並向下傳遞監聽事件。我們寫的FindViewById(),實際上就是以樹的深度來便利控件的id,找到對應的控件。
     在每棵控件樹的頂部,都有一個ViewParent對象,是樹的控制中心,所有的交互管理事件都由它統一分配和管理,從而對整個控件樹進行控制。 
     如下圖所示:

        說完了控件架構,我們再來看看,我們使用最多的Activity的結構,以及我們在Activity中調用setContentView(R.layout.main_activity),是怎麼填充佈局的。

     

        如上圖,表示的就是activity的結構。每個Activity都包含一個Window對象,通常由PhoneWindow來實現。在PhoneWindow內部有一個DecorView來作爲窗口的根View。在DecorView內部分別由TitleView和ContentView來構成。我們在調用setContentView(R.layout.main_activity)實際上填充的就是ContentView這一部分。所以就把DecorView中的內容展示在了PhoneWindow上。

       我們非常熟悉的ContentView實際上是一個id爲content的FrameLayout,我們的main_activity,就是填充在這個FrameLayout的內部。

      當我們在android程序中的OnCreate()方法中調用setContentView()後,ActivityManagerService會回調OnResume(),此時,整個DecorView纔會添加到PhoneWindow中,佈局纔會展示出來。

      提到ActivityManagerService想到一個面試題:

      Android系統會自動派發各種事件,事件從觸發到相應的程序相應的派發順序?

       答:EventHub——>KeyInputQueue——>WindowManagerService——>ViewRoot——>Activity——>PhoneWindow——>ContentView,在派發給我們自己的控件。基本就是一個服務隊列,接收到事件。從隊列中把事件分發給WindowManagerService也就是窗口管理類服務。然後分發給對應的窗口,窗口中的主View又分發給下面的子View。

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