注:下文源碼有刪減,截圖只體現(xiàn)主流程
1、換膚原理
換膚就是替換資源(文字、顏色、圖片等),而換膚基本有兩種模式:一是內(nèi)置換膚(在Apk包中存在多種資源(圖片、顏色值)用于換膚時候切換。自由度低,apk文件大,一般用于沒有其他需求的日間/夜間模式app);二是動態(tài)換膚(通過運行時動態(tài)加載皮膚包)。Android頁面加載是因為setContentView(),所以第一步看看setContentView源碼到底是怎么實現(xiàn)設(shè)置一個布局ID就能顯示頁面的(注:這里分析AppCompatActivity的setContentView方法,Activity的setContentView方法會不同)。
2、AppCompatActivity.java

3、AppCompatDelegateImplV9.java

注:使用LayoutInflater布局加載器將布局文件加載到contentParent中
4、LayoutInflater.java

注:獲取到一個Resources對象,獲取到xml解析器XmlResourceParser,解析布局文件

注釋1:通過解析器獲取一個節(jié)點名,比如我們布局文件的的一個TextView節(jié)點。
注釋2:獲取到根View
注釋3:解析所有子view

注釋1:通過mFactory2創(chuàng)建view;
注釋2:創(chuàng)建系統(tǒng)自帶的view;
注釋3:創(chuàng)建自定義view(自定義view帶了點)

注釋1 獲取到View的Class對象。
注釋2 通過反射獲取到View的構(gòu)造方法。
注釋3 通過構(gòu)造函數(shù)創(chuàng)建View。

注意:setFactory2只能設(shè)置一次,否則會報異常。所以我們在自定義Factory2的時候,需要重新設(shè)置mFactorySet的值(設(shè)置mFactorySet為false)。因為mFactorySet是私有的,可以通過反射,然后修改該參數(shù)值。