從Linux內(nèi)核系統(tǒng)到init進(jìn)程的分裂,以及后面會(huì)啟動(dòng)一個(gè)叫Zygote的進(jìn)程開(kāi)始,而Zygote會(huì)分裂出系統(tǒng)的核心服務(wù)進(jìn)程SystemServer,也就是SystemServer里面包括了底層的ActivityManagerService、PackageManagerService、WindowManagerService等,這些核心服務(wù)都是通過(guò)Zygote.init啟動(dòng)的,ActivityManagerService就是我們后面通過(guò)binder的ipc通信機(jī)制來(lái)與客戶端ActivityThread建立通信的。
當(dāng)我們點(diǎn)擊了應(yīng)用之后,系統(tǒng)的Launcher應(yīng)用會(huì)通過(guò)startActivity的方式啟動(dòng)應(yīng)用,而Intent的獲取會(huì)經(jīng)過(guò)如下幾部:?
(1)ActivityManagerService會(huì)通過(guò)PackageManager的resolveIntent()收集這個(gè)intent對(duì)象的指向信息。
(2)指向信息被存儲(chǔ)在一個(gè)intent對(duì)象中。
(3)下面重要的一步是通過(guò)grantUriPermissionLocked()方法來(lái)驗(yàn)證用戶是否有足夠的權(quán)限去調(diào)用該intent對(duì)象指向的Activity。
(4)如果有權(quán)限,?ActivityManagerService會(huì)檢查并在新的task中啟動(dòng)目標(biāo)activity.
(5)現(xiàn)在, 是時(shí)候檢查這個(gè)進(jìn)程的ProcessRecord是否存在了。
所以如果ProcessRecord不是null,ActivityManagerService會(huì)創(chuàng)建新的進(jìn)程來(lái)實(shí)例化該activity。ActivityManagerService調(diào)用startProcessLocked()方法來(lái)創(chuàng)建新的進(jìn)程, 該方法會(huì)通過(guò)前面講到的socket通道傳遞參數(shù)給Zygote進(jìn)程.Zygote孵化自身, 并調(diào)用ZygoteInit.main()方法來(lái)實(shí)例化ActivityThread對(duì)象并最終返回新進(jìn)程的pid。
隨后就是我們熟悉的ActivityThread.main方法通過(guò)Looper.prepare和Looper.loop方法開(kāi)啟消息循環(huán)
緊接著就是創(chuàng)建Application對(duì)象的過(guò)程,先是創(chuàng)建好ContextImpl對(duì)象,然后通過(guò)makeApplication方法將app進(jìn)程與Application建立聯(lián)系,這里的Application創(chuàng)建交給了Instrumentation的對(duì)象,其實(shí)后面activity的創(chuàng)建,生命周期的回調(diào)都是通過(guò)它來(lái)觸發(fā)的。
創(chuàng)建完Application后,緊接著就是我們熟悉的Activity,activity的創(chuàng)建同樣交給了Instrumentation對(duì)象,上面說(shuō)過(guò)ActivityManagerService會(huì)將攜帶的Intent對(duì)象交給了Lanucher應(yīng)用,Lanucher的startActivity經(jīng)過(guò)一系列的操作,最終會(huì)走Instrumentation的execStartActivity方法,該方法里面會(huì)去請(qǐng)求ActivityManagerService服務(wù),最終通過(guò)binder通信將信息傳給了客戶端的ApplicationThread,最終會(huì)觸發(fā)ApplicationThread的scheduleLaunchActivity方法,該方法將消息發(fā)送給了ActivityThread的handler對(duì)象,最終交給了Instrumentation對(duì)象創(chuàng)建activity。后面也就觸發(fā)一系列的生命周期方法。