在Activity中調(diào)用startService啟動(dòng)某個(gè)Service的流程如下所示:

在調(diào)用Activity.startService的時(shí)候?qū)嶋H上是調(diào)用的ContextImpl.startService,ContextImpl.startService會(huì)調(diào)用startServiceCommon方法,如下所示:

startServiceCommon中會(huì)調(diào)用ActivityManagerNativite.startService,也就是調(diào)用的ActivityManagerService.startService,通過binder方式將要啟動(dòng)的Service信息傳給SystemServer進(jìn)程。

AMS的startService函數(shù)中會(huì)將啟動(dòng)service交給mServices對(duì)象,該對(duì)象的實(shí)現(xiàn)為ActiveService。調(diào)用ActiveService.startServiecLocked方法。

ActiveService.startServiecLocked中調(diào)用retrieveServiceLocked來查找目標(biāo)Service的信息,查找時(shí)先在本地的ServiceMap查詢,查找不到就到PackageManagerService中查詢(App安裝后所有的組件信息都在PMS中保存了),最終取得ServiceLookupResult。之后會(huì)繼續(xù)調(diào)用startServiceInnerLocked:

startServiceInnerLocked繼續(xù)調(diào)用bringUpServiceLocked,該方法實(shí)現(xiàn)如下:

bringUpServiceLocked首先去獲取Service所在的進(jìn)程信息,然后調(diào)用realStartServiceLocked:

realStartServiceLocked會(huì)調(diào)用目標(biāo)進(jìn)程的ApplicationThread.scheduleCreateService函數(shù),最終運(yùn)行ActivityThread.handleCreateService來創(chuàng)建Service對(duì)象。

ActivityThread.handleCreateService通過反射創(chuàng)建了Service對(duì)象,并調(diào)用onCreate方法和attach方法。最終調(diào)用AMS.serviceDoneExecuting結(jié)束startService的流程。