天天看點

Android 進階UI-setContentVIew流程分析

作者:小爺ym
Android 進階UI-setContentVIew流程分析

可以看到是調用了getWindow.setContentView()方法。

我們接着看getWindows傳回的是PhoneWindow,那麼PhoneWindow怎麼去建立的呢,

那就要回到activity的啟動流程裡面了。

Android 進階UI-setContentVIew流程分析

在上圖中,,我們要關注的是activityThread通過調用performLuanchActivity方法,此方法中通過mInstatrumentation.newActivity(反射)建立activity。

Android 進階UI-setContentVIew流程分析

源碼activity

在調用onCallActivityOncreate之前會調用activity.attach方法,

Android 進階UI-setContentVIew流程分析

源碼activity

在這裡attach裡面就會調用new PhoneWindow方法。之後再去調用activity的onCreate方法。

Android 進階UI-setContentVIew流程分析

PhoneWindow.setContentView的主要目的是

建立decorView,拿到Content。這是第一個目的。

  • 執行的第一個方法就是installDecor()方法,這個方法也是建立decorView,拿到mContentParent。如圖所示:mdecor = gernerateDecor(-1)這個方法就是用來建立DecorView(直接new DecorView)的。

而這個mContentParent = gernerrateLayout(mDecor)就是擷取到mContentParent。

a, gernerrateLayout這裡面做的工作就是把window的title,以及一些屬性設定進來,比如說style屬性。根據不同的title屬性選擇不同的layoutresource。

b, 緊接着把這個R,layout,screen_simple inflaflate進來,擷取到這個“@android:id/content”,并把通過findviewbyid找到這個content轉成View并這個給到mContentParent。

上面這句話要多看幾遍

Android 進階UI-setContentVIew流程分析
  • 第二個部分主要是mLayoutInflater.inflate(layoutResID,mContentParent);這個是将R.layout.activity_main渲染到mContentParent。

最終總結下來就是下面這張圖了:

Android 進階UI-setContentVIew流程分析

總結一下,我們剛剛整個流程下來就是:

set content view這一塊,install這一個地方已經分析完了,它的目的主要幹兩件事,就是一個建立了我們的decorview,第二個是選擇根據各種各樣title建立一個視窗,選擇不同的布局,選擇了布局之後,再拿到我們布局裡面的這個content,然後comtentParent就有值了,在通過layoutInflate去渲染。

繼續閱讀