Android雜談--Activity、Window、View的關係

轉自 http://www.cnblogs.com/loulijun/archive/2012/02/09/2344681.htmlhtml

 

    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)其實就是下面內容。(註釋掉本行執行下面的代碼能夠更直觀)post

getWindow().setContentView(LayoutInflater.from(this).inflate(R.layout.main, null))this

即運行程序後,Activity會調用PhoneWindow的setContentView()來生成一個Window,而此時的setContentView就是那個最底層的View。而後經過LayoutInflater.infalte()方法加載佈局生成View對象並經過addView()方法添加到Window上,(一層一層的疊加到Window上)spa

因此,Activity其實不是顯示視圖,View纔是真正的顯示視圖code

注:一個Activity構造的時候只能初始化一個Window(PhoneWindow),另外這個PhoneWindow有一個」ViewRoot」,這個」ViewRoot」是一個View活ViewGroup,是最初始的跟視圖,而後經過addView方法將View一個個層疊到ViewRoot上,這些層疊的View最終放在Window這個載體上面htm

相關文章
相關標籤/搜索