Android界面架構(Activity,PhoneWiondow,DecorView)簡介


 

 

  在一個Android應用程序中,用戶界面通過View和ViewGroup對象構建。所有View的子類成為”Widget”,所有ViewGroup的子類成為”Layout”ViewViewGroup之間采用了組合設計模式ViewGroup作為布局容器類的最上層,布局容器里面又可以有ViewViewGroup

 

ViewGroupView的組合關系如下圖:

 

ViewGroup和View的繼承關系如下圖:

 

 

啟動Activity的時候,有一個setContentView()方法,Activity其實不是顯示視圖,實際上Activity調用了PhoneWindowsetContentView()方法,然后加載視圖,將視圖放到這個Window上,而Activity其實構造的時候初始化的是WindowPhoneWindow),Activity其實是個控制單元,即可視的人機交互界面Activity其實不是顯示視圖,View才是真正的顯示視圖

 

 

每個Activity包含一個PhoneWindow對象,PhoneWindow設置DecorView為應用窗口的根視圖,所有的UI部件都是放在DecorView中。在里面就是熟悉的TitleViewContentView,平時使用的setContentView()就是設置的ContentView

 從用戶角度來看,Android是個多窗口的操作系統,不同尺寸的窗口區域根據尺寸,位置,z-order及是否透明等參數 疊加起來一起並最終呈現給用戶。這些窗口既可以是來自一個應用,也可以來自與多個應用,這些窗口既可以顯示在一個平面,也可以是不同的平面。總而言之,窗 口是有層次的顯示區域,每個窗口在底層最終體現為一個個的矩形Buffer, 這些Buffer經過計算合成為一個新的Buffer,最終交付Display系統進行顯示。

 

Activity,PhoneWiondow,DecorView的關系如下圖:

 

 

 

  • Window

  位於 /frameworks/base/core/java/android/view/Window.java。該類是一個抽象類,提供了繪制窗口的一組通用API。可以將之理解為一個載體,各種View在這個載體上顯示。

  • PhoneWindow

  位於/frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindow.java。該類繼承於Window類,是Window類的具體實現,即我們可以通過該類具體去繪制窗口。並且,該類內部包含了一個DecorView對象,該DectorView對象是所有應用窗口(Activity界面)的根View。 簡而言之,PhoneWindow類是把一個FrameLayout類即DecorView對象進行一定的包裝,將它作為應用窗口的根View,並提供一組通用的窗口操作接口。

  • DecorView

  該類是PhoneWindow類的內部類。該類是一個FrameLayout的子類,並且是PhoneWindow的子類,該類就是對普通的FrameLayout進行功能的擴展,更確切點可以說是修飾(Decor的英文全稱是Decoration,即修飾的意思),比如說添加TitleBar(標題欄),以及TitleBar上的滾動條等 。最重要的一點是,它是所有應用窗口的根View

 

 

打個比喻:

Activity是一個工人,它來控制WindowWindow是一面顯示屏,用來顯示信息;View就是要顯示在顯示屏上的信息,這些View都是層層重疊在一起(通過infalte()addView())放到Window顯示屏上的。而LayoutInfalter就是用來生成View的一個工具,XML布局文件就是用來生成View的原料

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM