從三個流程上來分析:
一、從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,先分析到這個,我們看下底下這張調用流程圖: