啟動App流程
用戶點擊Home上的一個App圖標, 啟動一個應(yīng)用時:
Click事件會調(diào)用startActivity(Intent), 會通過Binder IPC機制, 最終調(diào)用到ActivityManagerService. 該Service會執(zhí)行如下操作:
第一步通過PackageManager的resolveIntent()收集這個intent對象的指向信息.
指向信息被存儲在一個intent對象中.
下面重要的一步是通過grantUriPermissionLocked()方法來驗證用戶是否有足夠的權(quán)限去調(diào)用該intent對象指向的Activity.
如果有權(quán)限, ActivityManagerService會檢查并在新的task中啟動目標activity.
現(xiàn)在, 是時候檢查這個進程的ProcessRecord是否存在了.
如果ProcessRecord是null, ActivityManagerService會創(chuàng)建新的進程來實例化目標activity.
創(chuàng)建進程
ActivityManagerService調(diào)用startProcessLocked()方法來創(chuàng)建新的進程, 該方法會通過前面講到的socket通道傳遞參數(shù)給Zygote進程. Zygote孵化自身, 并調(diào)用ZygoteInit.main()方法來實例化ActivityThread對象并最終返回新進程的pid.
ActivityThread隨后依次調(diào)用Looper.prepareLoop()和Looper.loop()來開啟消息循環(huán).
流程圖如下:
綁定Application
接下來要做的就是將進程和指定的Application綁定起來. 這個是通過上節(jié)的ActivityThread對象中調(diào)用bindApplication()方法完成的. 該方法發(fā)送一個BIND_APPLICATION的消息到消息隊列中, 最終通過handleBindApplication()方法處理該消息. 然后調(diào)用makeApplication()方法來加載App的classes到內(nèi)存中.
流程如下:
啟動Activity
經(jīng)過前兩個步驟之后, 系統(tǒng)已經(jīng)擁有了該application的進程. 后面的調(diào)用順序就是普通的從一個已經(jīng)存在的進程中啟動一個新進程的activity了.
實際調(diào)用方法是realStartActivity(), 它會調(diào)用application線程對象中的sheduleLaunchActivity()發(fā)送一個LAUNCH_ACTIVITY消息到消息隊列中, 通過 handleLaunchActivity()來處理該消息.
假設(shè)點擊的是一個視頻瀏覽的App, 其流程如下: