? ? ? ?之前對(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ò)多的贅述。