Android 中的Activity、Window、View之間的關係,androidactivity

來源:互聯網
上載者:User

Android 中的Activity、Window、View之間的關係,androidactivity

 

一、概述     

   Activity 可以說是應用程式的載體(也可以理解為介面的載體,但是不介面),使用者能夠在上面繪製介面(Activity本身不繪製介面),並提供使用者處理事件的API,維護應用程式的生命週期(Android應用程式是由多個 Activity 堆積而成,而各個 Activity 又有其獨立的生命週期)。

        Activity內部組合了一個Window(這是一個抽象類別,具體是PhoneWindow)對象。我們自己寫的擴充一個Activity時,在onCreate 方法中調用 setContentView,實際上是調用Window對象的 setContentView,所以說介面繪製全部是由Window類的實作類別(PhoneWindow類)來完成的。        二、源碼分析     1.   跟蹤源碼進入到 Activity 中看到 setContentView的實現如下: 
1  public void setContentView(int layoutResID) {2         getWindow().setContentView(layoutResID);3         initActionBar();4     }

      看第二行代碼,先得到一個 Window 對象。

1 public Window getWindow() {2         return mWindow;3     }

       getWindow 很簡單只是返回一個 對象而已,那麼,Window對象到底是在哪兒執行個體化的呢?

  我們可以看看,Activity 中的 attach 方法,這裡面得到了一個 Window 對象

mWindow = PolicyManager.makeNewWindow(this);


  2.   由Activity中的 setContentView 方法可以看到,介面繪製並不是由 Activity 完成的,他是調用了 Window 類的 setContentView 來實現的。所以我們就去看看 Window 類的代碼:

public abstract void setContentView(int layoutResID);

    我們可以看到, Window 類是一個抽象類別,並且 setContentView  是一個抽象方法。所以說,其具體實現是由 實現 Window類的類來完成的(PhoneWindow)。

  3.   在文檔中已經描述了:The only existing implementation of this abstract class is  android.policy.PhoneWindow.  我們要來看看這個類才能知道 介面是如何完成繪製的。

 1  @Override 2     public void addContentView(View view, ViewGroup.LayoutParams params) { 3         if (mContentParent == null) { 4             installDecor(); 5         } 6         if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) { 7             // TODO Augment the scenes/transitions API to support this. 8             Log.v(TAG, "addContentView does not support content transitions"); 9         }10         mContentParent.addView(view, params);11         final Callback cb = getCallback();12         if (cb != null && !isDestroyed()) {13             cb.onContentChanged();14         }15     }

      先判斷mContentParent是否為空白,如果為空白就調用 installDecor 方法(自己可以看一下源碼),  最後會添加 View。

    Window 中有一個 DecorView,可以理解為“ViewRoot”,引號是說其實這個“ViewRoot”是一個View或者說ViewGroup,是最初始的根視圖。構建視圖就是向這裡面添加。所以到這裡大概可以知道,installDecor 方法大概是 構建一個根視圖。

 

三、總結

                               

  Activity建立時系統會調用其 attach 方法,將其添加到ActivityThread當中,在attach方法中建立了一個window對象。

  我們知道Window組合了一個 DocerView, 當使用者調用 setContentView 的時候會把一棵 View 樹仍給DocerView。 View樹是已經建立好的執行個體對象,所以我們要研究 DocerView是個什麼東西,它是如何被建立的。

  我們回頭看看Window實現裡邊的setContentView方法,代碼中有一個 installDecor 方法,這個方法中有一個  generateDecor。 generateDecor直接new了一個DecorView對象

protected DecorView generateDecor() {        return new DecorView(getContext(), -1); }


  當 DocerView 被建立後,就會調用  mContentParent.addView(view, params); 來將 view  添加到 DocerView當中。

最後總結一下:

  

  Activity在onCreate時調用attach方法,在attach方法中會建立window對象。window對象建立時並沒有建立 DocerView 對象。使用者在Activity中調用setContentView,然後調用window的setContentView,這時會檢查DecorView是否存在,如果不存在則建立DecorView對象,然後把使用者自己的 View  添加到 DecorView 中。


裝模作樣的聲明一下:本博文章若非特殊註明皆為原創,若需轉載請保留原文連結(http://www.cnblogs.com/kest/p/5141817.html)及作者資訊k_est 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.