天天看點

Android 開發藝術探索筆記(18)

1. Activity的工作過程

我們從startActiviity方法開始分析,startActivity有好幾種重載方式,但最終都會調用startActivityForResult方法,它的實作如下:

Android 開發藝術探索筆記(18)

在mParent == null中,mParent代表的是ActivityGroup。ActivityGroup最開始被用來在一個界面中嵌入多個子Activity,但是其在API13就被丢棄了,系統采用Fragment來代替ActivityGroup。

mMainThread.getAppliactionThread()它的類型是ApplicationThread,ApplicationThread是ActivityThread的一個内部類,通過後面的分析可以發現這兩個Thread都發揮着重要的作用。下面是execStartActivity的代碼:

Android 開發藝術探索筆記(18)
Android 開發藝術探索筆記(18)

在try中有個ActivityManagerNativt.getDefault,就是通過它的startActivty方法完成,而它是繼承自Binder并實作了IActivityManager,是以它的具體實作是ActivityManagerService,在AMN中,AMS這個binder對象采用單例模式對外提供,Singleton是一個單例的封裝類,第一次調用它的get方法時,它會通過create方法來初始化AMS這個Binder對象,在後續的調用中直接傳回之前建立的對象。裡面還有一個checkStartActivitiyResult是檢查啟動Activity的結果。接着看AMS的startActivity。

Android 開發藝術探索筆記(18)
Android 開發藝術探索筆記(18)

這段代碼就是一長串的調用,從AMS一直調用到ActivityStack,最後在ActivityStackSupervisor和ActivityStack之間傳遞。

Android 開發藝術探索筆記(18)

performLaunchActivity方法最終完成了Activity對象的建立和啟動過程,它主要完成了以下事情:

(1)從ActivityRecord中擷取待啟動Activity的元件資訊。

(2)通過Instrumentaion的newActivity方法使用類加載器建立Activity對象。

(3)通過LoadedApk的makeAppliaction方法來嘗試建立Application對象

(4)通過ContextImpl對象并通過Activity的attach方法來完成一些重要資料的初始化。

2. Service的工作過程

主要了解Service的啟動過程和綁定過程。Service有兩種狀态,一種是啟動狀态,一種是綁定狀态。這兩種狀态是可以共存的。通過Context的startService可以啟動一個服務。

Android 開發藝術探索筆記(18)

通過Context的bindService可以綁定一個服務。

Android 開發藝術探索筆記(18)

Service的啟動過程:

Service的啟動過程是從ContextWrapper的startService開始的。

Android 開發藝術探索筆記(18)

上面的mBase的類型是ContextImpl。從ContextWrapper,大部分的功能都是由mBase來完成。下面是ContextImpl的startService:

Android 開發藝術探索筆記(18)