捋一捋 Activity 的啟動流程 以及 介面的初始化過程
http://blog.csdn.net/luoshengyang/article/details/6689748 這個是老羅對於android啟動流程進行的程式碼跟蹤講解,非常的細緻全面, 我是繼續跟蹤到介面初始化完成
1. 在啟動Activity的時候, ActivityThread 類中的 scheduleLaunchActivity 方法會被呼叫
2. 然後會發送一個Handler what == LAUNCHER_ACTIVITY
3.然後會走 handlerLauncherActivity 方法 , 方法內呼叫performLauncherActivity 建立一個Activity
4.performLauncherActivity 方法內會載入Activity 並通過attach方法 對activity進行初始化
5.performLauncherActivity方法內attch被呼叫
6.最後 performLauncherActivity方法內呼叫 activity的oncreate()方法
7. 在activity的oncreate方法中我們都會進行setcontentview 來設定activity的佈局, 接下來我們跟蹤setcontentview方法
8. Activity中的setcontentview() 會被呼叫 , 然後會呼叫getwindow方法, 然後將layout設定給返回物件,那麼這個物件是誰呢? 接著跟
9.看到返回的是一個window型別,這個時候需要注意的是在activity的時候有一個方法被呼叫用來初始化activity的方法attach, 也就是第5步內容,然後看一下attach方法
10. 可以看到返回的mWindow是一個PhoneWindow物件, 然後我們繼續跟蹤PhoneWindow的setcontentview方法
11.這裡有一個方法是installDecor
12. generateDecor方法
13. 這裡new了一個DecorView 是PhoneWindow的內部類, 那DecorView 是個什麼東東呢
14. DecorView 原來是FrameLayout的子類, decorview建立完成後,在11部還會呼叫generatelayout的方法, 這個方法跟蹤瞭解到是初始化一些屬性
15. 這樣一個DecorView建立完成了 然後 我們繼續跟蹤 第10部 裡面有一個方法 mLayoutInflater.inflate(layoutResID, mContentParent);
將我們setcontentview設定的layoutid 和 剛剛建立好的 decorview 傳遞進去了 , 跟蹤一下這個方法
...
可以看出來是解析xml並且例項化 新增到decorview中, 也就是說 我們寫的佈局都存在於這個decorview上面了, 那麼它是怎麼被顯示出來的呢
16. 在啟動流程中 handlerLauncherActivity 方法中 handleResumeActivity(r.token, false, r.isForward, !r.activity.mFinished && !r.startsNotResumed); 這個方法被呼叫了
這個方法中的程式碼塊(可在第3 步中的圖片看到這個方法)
看到了吧 方法中將我們剛剛初始化完成的decorview , 通過windowmanager的addview 傳遞過去了,這個時候 其實就能夠顯示在手機上了, 本著不求甚解的精神再繼續跟一下
17. 其實這個windowmanager用的是一個windowmanager的實現類windowmanagerImpl
18.跟蹤windowmanagerImpl的addview方法
19. 看到將view新增到 mGlobal了 這個mGlobal是什麼東東呢 是WindowManagerGlobal類 , 並且檢視一下addview的方法
20.檢視WindowManagerGlobal 的 addview方法, 方法內會建立一個 viewrootimpl , 並且通過viewrootimpl的setview方法將decorview傳遞給了viewrootimpl
21. 接下來跟蹤viewrootimpl的setview方法
方法內會呼叫 requestLayout();
22. 繼續跟蹤 requestLayout方法
方法內對於進行了decorview的 測量 佈局 和繪製工作 並且這些方法 都是不斷向下遞迴的, 這樣view樹就被建立起來了
到這基本上activity的建立 到現實 都完成了