startService源碼從應用主進程到AMS進程的過程分析及涉及裝飾、代理、單利設計模式

從三個流程上來分析:

一、從activity的startService到ContextImpl的大概流程,涉及到裝飾模式:

在Activity類中實現startService(),

從類圖關系中,Activity繼承了ContextThemeWrapper,ContextThemeWrapper繼承ContextWrapper類,所以startService在ContextWrapper類startService函數,我們看下ContextWrapper中startService函數:

ContextWrapper類:


有一個成員變量mBase,它是一個ContextImpl實例,最終startService走到ContextImpl類中:


這幾個類設計是典型的裝飾模式(Decorator),ContextWrapper的startService函數調用ContextImpl的startService額外職責后,可以繼續做自己的事情。

我們接下來看這個mBase是什么時候生成的。

在啟動activity時Activity.startActivity-->Activity.startActivityForResult-->Instrumentation.execStartActivity-->ActivityManagerNative.getDefault(ActivityManagerProxy).startActivity-->ActivityManagerService.startActivity-->ActivityStack.startActivityMayWait-->ActivityStack.startActivityLocked…..-->這中間一系列的上一個activity的on Pause操作-->ActivityStack.realStartActivityLocked-->ApplicationThreadProxy.scheduleLaunchActivity-->ApplicationThread.scheduleLaunchActivity-->H.handleMessage-->ActivityThread.handleLaunchActivity-->ActivityThread.performLaunchActivity.

ActivityThreadperformLaunchActivity函數創建activity以及ContextImpl的初始:

看下這源碼:


紅框是創建activity,繼續看


CreateBaseContextForActivity創建ContextImpl,并把activity設置為outerContext的:


接著實行activity類中的attach函數,這個attach會關聯Ativity、Window(phoneWindow)、WindowManager:


通過attachBaseContext(context)把ContextImpl設置到父類ContextWrapper的mBase。

二、從ContextImpl的startService到ActivityManagerProxy的大概流程,涉及代理、單利模式


我們抽離看ContextImpl的startService開始:

ContextImpl類:



我們接著看ActivityManageNative類中的getDefault:



這AcivityManagerNative、ActivityManagerProxy就是典型的代理模式,AcivityManagerNative把一些工作委托給ActivityManagerProxy來做。

這里面gDefault.get()是一個單例的助手類延遲初始化。我們看下Singleton的設計:


三:我們看下ActivityManagerProxy的startService與system_server的ActivityManagerService是如何調用:

來看下ActivityManagerProxy類中的startService:


其中mRemote是IBinder,就是ActivityManagerService的,通過Binder驅動走到system_server的ActivityManagerService的onTransact函數,

ActivityManagerService的onTransact:


調用到父類的ActivityManagerNative的onTransact():



startService的標示是START_SERVICE_TRANSACTION,之后就走到了ActivityManagerService的startService函數:


就開始走到ActiveServices mServices的startServiceLocked,先分析到這個,我們看下底下這張調用流程圖:


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容