startService的Service啟動(dòng)過程分析

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

startService的啟動(dòng)流程

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

ContextImpl.startServiceCommon

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

ActivityManagerService.startService

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

ActiveService.startServiecLocked

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

ActiveService.startServiceInnerLocked

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

bringUpServiceLocked

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

realStartServiceLocked

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

ActivityThread.handleCreateService

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容