AndroidUI繪製流程,一步一步深入原始碼解析(一)
1、UI結構,從Activity的setContentView()入手;瞭解xml佈局的巢狀關係

第一步、根據程式碼,原始碼中找到Actitivyt中setContentView()方法的實現,這裡我用的是 http://androidxref.com/ 線上原始碼閱讀平臺,選擇8.0原始碼

在/ frameworks / base / core / java / android / app / Activity.java
/**
* Set the activity content from a layout resource. The resource will be
* inflated, adding all top-level views to the activity.
*
* @param layoutResID Resource ID to be inflated.
*
* @see #setContentView(android.view.View)
* @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams)
*/
public void setContentView(@LayoutRes int layoutResID) {
getWindow().setContentView(layoutResID);
initWindowDecorActionBar();
}
我們從activity中setCotentview()呼叫了getWindow().setContentView()方法。我們可以看到他呼叫了getWindow()方法,這個方法返回的是一個window物件。所以我的目標就轉移到了Window類
第二步、Window是一抽象類,它提供標準的UI策略,例如背景、標題區域,預設金鑰處理,它只有一個實現類PhoneWindow。我們在PhoneWindow中找到setContentView()方法
/ frameworks / base / core / java / com / android / internal / policy / PhoneWindow.java


官網註釋:這是放置視窗內容的檢視,它要麼是DecorView本身,或者是一個DecorView的子view。
這裡猜測,mContentParent就是一個放置視窗內容的一個容器,父佈局;
再進入installDecor();方法中檢視,找到給mContentParent賦值的地方

接著再進入generateLayout()方法,最終找到給mDecor載入資源的地方

這裡物件mLayoutInflater就是用來載入佈局檔案的,layoutResource就是要載入的佈局id,前面一堆條件判斷就是為layoutResource賦值,
這裡layoutResource = R.layout.screen_simple
第三步、此時再找到DecorView中的onResourcesLoaded檢視,
/ frameworks / base / core / java / com / android / internal / policy / DecorView.java

最終這個資源被載入到跟佈局中;
總結一下以上流程,只是做了佈局的初始化工作,將佈局檔案載入到了mContentParent中,但是還沒有載入到Window中以及佈局的繪製工作都沒完成;
這裡完成的跟佈局大體結構如下:


那麼decorView是如何新增到window上的呢,ui又是怎麼樣渲染繪製上去的呢?請看(二)