UI繪制流程(1) - 程序啟動(dòng)

UI繪制流程(1)- 程序啟動(dòng)

UI繪制流程(2) - 布局加載及初始化

? ? ? ?之前對(duì)于ui繪制方面的知識(shí)點(diǎn)比較零碎,想通過(guò)這篇博客將過(guò)去積累的筆記和知識(shí)點(diǎn)串起來(lái)做一個(gè)匯總,同時(shí)分享給大家。大家知道我們手機(jī)上看到的視圖是由activity的oncreate方法中加載創(chuàng)建,在onstart()方法中顯示,在onresume()方法中獲取焦點(diǎn)。今天說(shuō)一下Android在oncreate方法中ui繪制做了哪些事情。

1、程序啟動(dòng)

大家知道Java中有main方法為程序的入口,Android本身的語(yǔ)言為Java,但是我們平時(shí)開發(fā)中沒(méi)有main方法,這個(gè)main方法在哪呢?Android程序又是如何開始運(yùn)行的呢?

? ? ? 在Android中有一個(gè)ActivityThread類,通過(guò)類名我們就可以推斷出和主線程有關(guān)。在這個(gè)類中我們便能找到我們所要的main,沒(méi)錯(cuò)正如大家所想這便是我們程序的入口。我們的程序從這里開始。那么就看看在main方法中到底做了什么!

通過(guò)源碼可以看到,在main函數(shù)中實(shí)例化activity線程,并且調(diào)用了attach()方法;那就看一下attach()中做了什么。

在這里調(diào)用的是系統(tǒng)的Activity管理服務(wù),他是來(lái)調(diào)度Android程序里面的Activity的開啟等工作.并且這里給了一個(gè)Binder接口,通過(guò)binder通信機(jī)制來(lái)實(shí)現(xiàn)系統(tǒng)和activity跨進(jìn)程之間的訪問(wèn)。

回到attach方法當(dāng)中繼續(xù)往下看,在獲得ActivityManager之后,調(diào)用了一個(gè)attachApplication方法,傳入的參數(shù)是mAppThread,這是一個(gè)ApplicationThread類型的Binder對(duì)象,它的作用是用來(lái)進(jìn)行進(jìn)程間通信的。通過(guò)attachApplication方法將activity與applciationThread相關(guān)聯(lián),把a(bǔ)ctivity相關(guān)信息存儲(chǔ)在applciationThread里面,為activity的各種狀態(tài)做了相對(duì)應(yīng)的準(zhǔn)備工作。

接下來(lái)看一下ApplciationThread類里面到底又是什么,又做了哪些事情。在進(jìn)入到ApplciationThread類之中,會(huì)看到很多schedlexxxxxx()方法,通過(guò)方法名就可知道這些方法就會(huì)在表明,代表的是在執(zhí)行Activity的某種狀態(tài)時(shí)調(diào)用的計(jì)劃執(zhí)行方法。比如:scheduleStopActivity()方法就是計(jì)劃停止activity時(shí)會(huì)調(diào)用的。


幾乎在每一個(gè)方法中都有sendMessage()方法發(fā)送消息,其中scheduleLaunchActivity()實(shí)現(xiàn)activity計(jì)劃加載,方法中ActivityClientRecord對(duì)象,這個(gè)對(duì)象其實(shí)實(shí)際上就是我們的Activity。


當(dāng)Activity狀態(tài)改變時(shí),都會(huì)有對(duì)應(yīng)的一個(gè)消息發(fā)送出去

而接收這里,我能發(fā)現(xiàn)通過(guò)發(fā)送時(shí)不同的狀態(tài),這邊調(diào)用了不同的handlerXXXActivity方法。在這里看到了生命周期的影子。在Application運(yùn)行期間,當(dāng)對(duì)activity進(jìn)行操作、狀態(tài)改變時(shí),其實(shí)是通過(guò)Handler消息機(jī)制來(lái)完成的,在上圖中接受消息調(diào)用handleLaunchActivity()方法來(lái)啟動(dòng)activity。


進(jìn)入到handleLaunchActivity()方法中performLaunchActivity()獲得activity對(duì)象,其中保存有activity信息。進(jìn)入到方法中


Application運(yùn)行的過(guò)程當(dāng)中,對(duì)于Activity的操作,狀態(tài)轉(zhuǎn)變,其實(shí)實(shí)際上是通過(guò)Handler消息機(jī)制來(lái)完成的,Application當(dāng)中只管去發(fā), 由消息機(jī)制負(fù)責(zé)調(diào)用,因?yàn)樵趍ain方法當(dāng)中我門的Looper輪訓(xùn)器是一直在進(jìn)行輪訓(xùn)的而當(dāng)我們?cè)诩虞dActivity的時(shí)候,當(dāng)中調(diào)用了一個(gè)performLaunchActivity()方法,在這個(gè)中間我發(fā)現(xiàn)了我們onCreate的調(diào)用痕跡。這個(gè)方法中還包含activity封裝到對(duì)象當(dāng)中,在這里就不在過(guò)多的贅述。這個(gè)方法中還包含activity封裝到對(duì)象當(dāng)中,在這里就不在過(guò)多的贅述。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,063評(píng)論 25 709
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 14,011評(píng)論 2 59
  • 好吧,終于要開始講解Activity的啟動(dòng)流程了,Activity的啟動(dòng)流程相對(duì)復(fù)雜一下,涉及到了Activity...
    01_小小魚_01閱讀 944評(píng)論 1 1
  • 好久沒(méi)有刻意寫簡(jiǎn)書了。 因?yàn)槲议_始熱情寫時(shí)候發(fā)現(xiàn)很容易有個(gè)心魔帶走自己心,開始在意別人評(píng)價(jià),開始渴望得到更多的喜歡...
    釵子同學(xué)閱讀 226評(píng)論 1 1
  • 2014年秋天,一個(gè)人拖著行李箱來(lái)到了這座陌生的城市。其實(shí)離家也并不遠(yuǎn),只是上大學(xué)前我從未走遠(yuǎn)過(guò)。而此時(shí)的我,就像...
    Mo伊諾閱讀 259評(píng)論 0 0

友情鏈接更多精彩內(nèi)容