Activity、View、Window、DecorView的关系
android中真正展示給用戶的是window和view,activity在android中所的作用主要是處理一些邏輯問題,比如生命周期的管理、建立窗口等。在android中,窗口的管理還是比較重要的一塊,因為他直接負責把內容展示給用戶,并和用戶進行交互。響應用戶的輸入等。 View是真正顯示的矩形區域,DecorView是頂層View,也就是主View。 相互之間的關系可以理解為一個Activity包含了一個Window,這個Window其實是一個PhoneWindow,在PhoneWindow中包含了DecorView,變量名稱為mDecor,mDecor有一個子View,這個子View的布局方式根據設定的主題來確定,在這個子View的xml布局中包含了一個FrameLayout元素,這個FrameLayout元素的id為content,這個content對應于PhoneWindow中的mContentParent變量,用戶自定義的布局作為mContentParent的子View存在,一般情況下mContentParnet只有一個子View,如果在Activity調用addView方式實際上是給PhoneWindow中的mContentParent添加子View,由于mContentParent是一個FrameLayout,因此新的子view會覆蓋通過setContentView添加的子view。僅通過setContentView添加子View類View層次與下圖類似:
(上面的FrameLayout和TextView應該是標題欄,不一定有)。
通過addView方式給Activity添加子view層次圖如下所示,右下角兩個LinearLayout為用戶自定義的布局:
Android 的窗口管理是基于 C/S 模式的,客戶端就是應用程序,服務端就是 Window Manager服務。
Activity建立一個主窗口之后,在將主窗口添加到WindowManager 時,首先要建立WindowManager的代理對象,并打開一個Session(session:會話;該session由上面函數中的第二行代碼實現,實現 IWindowSession AIDL 接口),并維持該會話(Activity將通過該會話與WindowManager 建立聯系,這個Session 是C/S 體系的基礎)。Client通過這個Session將window加入到WindowManager中。
public static IWindowSession getWindowSession(Looper mainLooper) { InputMethodManager imm = InputMethodManager.getInstance(mainLooper); //獲取回話Session,ViewRoot和Window manager通信, return sWindowSession = IWindowManager.Stub.asInterface(ServiceManager.getService("window")) .openSession(imm.getClient(), imm.getInputContext()); }一個完整的窗口概念包含了 View,ViewRoot,Window Manager Service,Window,Decor View,IWindow,ISession,WindowState。他們之間的關系如下:
Client 端的 Activity 通過 IWindowSession 會話與Window Manager Service 建立對話,而 Window Manager Service 通過 IWindow 接口訪問 Client,將消息傳遞到Client 端,在通過消息分發渠道,將消息傳遞到具體的消息處理函數。(用戶輸入等操作最先是到窗口管理服務,由窗口管理服務發給活動窗口,再一步步傳遞到焦點)。
通過IWindowSession機制就可以保證Activity和Window manager保持聯系,通過IWindow可以將window manager收集到的消息分發出去。
總結
以上是生活随笔為你收集整理的Activity、View、Window、DecorView的关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android应用坐标系统全面详解
- 下一篇: Android XML 实例化的过程