1. Activity的工作過程
我們從startActiviity方法開始分析,startActivity有好幾種重載方式,但最終都會調用startActivityForResult方法,它的實作如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SMyETO1MDNmNDOiFGZkBDZyYzXzIzMyETM1EzLcdDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
在mParent == null中,mParent代表的是ActivityGroup。ActivityGroup最開始被用來在一個界面中嵌入多個子Activity,但是其在API13就被丢棄了,系統采用Fragment來代替ActivityGroup。
mMainThread.getAppliactionThread()它的類型是ApplicationThread,ApplicationThread是ActivityThread的一個内部類,通過後面的分析可以發現這兩個Thread都發揮着重要的作用。下面是execStartActivity的代碼:
在try中有個ActivityManagerNativt.getDefault,就是通過它的startActivty方法完成,而它是繼承自Binder并實作了IActivityManager,是以它的具體實作是ActivityManagerService,在AMN中,AMS這個binder對象采用單例模式對外提供,Singleton是一個單例的封裝類,第一次調用它的get方法時,它會通過create方法來初始化AMS這個Binder對象,在後續的調用中直接傳回之前建立的對象。裡面還有一個checkStartActivitiyResult是檢查啟動Activity的結果。接着看AMS的startActivity。
這段代碼就是一長串的調用,從AMS一直調用到ActivityStack,最後在ActivityStackSupervisor和ActivityStack之間傳遞。
performLaunchActivity方法最終完成了Activity對象的建立和啟動過程,它主要完成了以下事情:
(1)從ActivityRecord中擷取待啟動Activity的元件資訊。
(2)通過Instrumentaion的newActivity方法使用類加載器建立Activity對象。
(3)通過LoadedApk的makeAppliaction方法來嘗試建立Application對象
(4)通過ContextImpl對象并通過Activity的attach方法來完成一些重要資料的初始化。
2. Service的工作過程
主要了解Service的啟動過程和綁定過程。Service有兩種狀态,一種是啟動狀态,一種是綁定狀态。這兩種狀态是可以共存的。通過Context的startService可以啟動一個服務。
通過Context的bindService可以綁定一個服務。
Service的啟動過程:
Service的啟動過程是從ContextWrapper的startService開始的。
上面的mBase的類型是ContextImpl。從ContextWrapper,大部分的功能都是由mBase來完成。下面是ContextImpl的startService: