在每棵控件樹的頂部,都有一個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。