標籤:
轉自 http://www.cnblogs.com/loulijun/archive/2012/02/09/2344681.html
Activity其實更像一個控制單元,控制window上顯示的View內容,比如在Activity裡有一個addContentView()方法,實際上調用了window的addContentView()方法
/** * Add an additional content view to the activity. Added after any existing * ones in the activity -- existing views are NOT removed. * * @param view The desired content to display. * @param params Layout parameters for the view. */ public void addContentView(View view, ViewGroup.LayoutParams params) { getWindow().addContentView(view, params); initWindowDecorActionBar(); }
打個比喻:
Activity是一個工人,它來控制Window;Window是一面顯示屏,用來顯示資訊;View就是要顯示在顯示屏上的資訊,這些View都是層層重疊在一起(通過infalte()和addView())放到Window顯示屏上的。而LayoutInfalter就是用來產生View的一個工具,XML布局檔案就是用來產生View的原料
再來說說代碼中具體的執行流程
setContentView(R.layout.main)其實就是下面內容。(注釋掉本行執行下面的代碼可以更直觀)
getWindow().setContentView(LayoutInflater.from(this).inflate(R.layout.main, null))
即運行程式後,Activity會調用PhoneWindow的setContentView()來產生一個Window,而此時的setContentView就是那個最底層的View。然後通過LayoutInflater.infalte()方法載入布局產生View對象並通過addView()方法添加到Window上,(一層一層的疊加到Window上)
所以,Activity其實不是顯示視圖,View才是真正的顯示視圖
註:一個Activity構造的時候只能初始化一個Window(PhoneWindow),另外這個PhoneWindow有一個”ViewRoot”,這個”ViewRoot”是一個View活ViewGroup,是最初始的跟視圖,然後通過addView方法將View一個個層疊到ViewRoot上,這些層疊的View最終放在Window這個載體上面
Android雜談--Activity、Window、View的關係