一張圖看懂setContentView解析佈局流程

高清圖片地址:https://www.edrawsoft.cn/viewer/public/s/max/aafc5037041214

前言:

關於Android系統源碼這一塊, 我發現很多技術博客都是把部分源碼貼出來, 然後進行講解. 我們學習的時候一邊看博客, 一邊看源碼。 但是我發現一下幾個問題:
1. 系統源碼的執行順序本來就是跳來跳去的, 有時候一個方法執行下去,直接回不來了, 不記得回到那兒了, 分叉路口太多,需要反覆從頭看, 看多了熟悉了以後就知道跳哪兒了.

2. 即使現在看懂了,但是太久不用, 也很容易忘記執行的順序,畢竟源碼中的分叉路口比較多, 經常要從頭一點一點找源碼. 有時候自己寫的代碼,太久不看都容易忘, 更別說系統源碼了.

以上是我發現的幾個問題. 所以我覺得用圖形來輔助記憶, 效果會更好一些, 把主要執行順序記錄即可, 其它細節可以慢慢再看.

這裏只是介紹了總體流程, 對着圖, 先把總體流程走通,細節再慢慢看

一. 啓動App, 看ActivityThreadc.class

AMS看成是黑盒子, 先不管.
通過AMS執行到ActivityThread.performLaunchActivity(), 做了兩件事:

  1. 反射獲取Activity對象.
  2. 執行activity.attach(), window = new PhoneWindow();

二. 繼承Activity和AppCompatActivity的執行順序是不一樣的.

  1. Activity直接就執行PhoneWindow的方法。
  2. AppCompatActivity則加了很多東西.
    無論哪個, 最終都會走PhoneWindow.setContentView(); 所以先看這個方法。

三. 看圖PhoneWindow.class

1. setContentView()方法.
①. installDecor(); 初始化DecorView.
②. 將我們的佈局添加到 mContentParent.

2. installDecor()方法.
①. new Decor對象
②. Decor.add(系統佈局)
③ mContentParent 其實就是 系統佈局中id爲R.id.content的控件.

四. 繼承AppCompatActivity的情況, 看圖 AppCompatDelegateImpl.class

setContentView()--->ensureSubDecor()--->createSubDecor()
1. createSubDecor()方法.
第5步設置id.
①. 把PhoneWindow中的控件id = R.id.content(16908290)換成了-1
② 把新的系統佈局subDecor,id換成了R.id.content(16908290)

2. setContentView()方法.
第2步查找控件 ViewGroup contentParent = mSubDecor.findViewById(android.R.id.content);
實際上是去新的佈局去找.

五. 看圖 LayoutInflater.class

總的來說,就是通過XmlPullParser循環遞歸xml文件, 通過反射獲取View對象, 用map進行保存.

快要回家過年了, 時間比較趕, 只能寫到這兒了, 如果有什麼更好的建議, 歡迎提出,如果覺得對你有幫助, 點贊收藏.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章