從三個(gè)流程上來分析:
一郑现、從activity的startService到ContextImpl的大概流程湃崩,涉及到裝飾模式:
在Activity類中實(shí)現(xiàn)startService(),
從類圖關(guān)系中,Activity繼承了ContextThemeWrapper,ContextThemeWrapper繼承ContextWrapper類接箫,所以startService在ContextWrapper類startService函數(shù)攒读,我們看下ContextWrapper中startService函數(shù):
ContextWrapper類:
有一個(gè)成員變量mBase,它是一個(gè)ContextImpl實(shí)例辛友,最終startService走到ContextImpl類中:
這幾個(gè)類設(shè)計(jì)是典型的裝飾模式(Decorator)薄扁,ContextWrapper的startService函數(shù)調(diào)用ContextImpl的startService額外職責(zé)后,可以繼續(xù)做自己的事情废累。
我們接下來看這個(gè)mBase是什么時(shí)候生成的邓梅。
在啟動(dòng)activity時(shí)Activity.startActivity-->Activity.startActivityForResult-->Instrumentation.execStartActivity-->ActivityManagerNative.getDefault(ActivityManagerProxy).startActivity-->ActivityManagerService.startActivity-->ActivityStack.startActivityMayWait-->ActivityStack.startActivityLocked…..-->這中間一系列的上一個(gè)activity的on Pause操作-->ActivityStack.realStartActivityLocked-->ApplicationThreadProxy.scheduleLaunchActivity-->ApplicationThread.scheduleLaunchActivity-->H.handleMessage-->ActivityThread.handleLaunchActivity-->ActivityThread.performLaunchActivity.
ActivityThreadperformLaunchActivity函數(shù)創(chuàng)建activity以及ContextImpl的初始:
看下這源碼:
紅框是創(chuàng)建activity,繼續(xù)看
CreateBaseContextForActivity創(chuàng)建ContextImpl邑滨,并把a(bǔ)ctivity設(shè)置為outerContext的:
接著實(shí)行activity類中的attach函數(shù)日缨,這個(gè)attach會(huì)關(guān)聯(lián)Ativity、Window(phoneWindow)驼修、WindowManager:
通過attachBaseContext(context)把ContextImpl設(shè)置到父類ContextWrapper的mBase殿遂。
二、從ContextImpl的startService到ActivityManagerProxy的大概流程,涉及代理乙各、單利模式
我們抽離看ContextImpl的startService開始:
ContextImpl類:
我們接著看ActivityManageNative類中的getDefault:
這AcivityManagerNative墨礁、ActivityManagerProxy就是典型的代理模式,AcivityManagerNative把一些工作委托給ActivityManagerProxy來做耳峦。
這里面gDefault.get()是一個(gè)單例的助手類延遲初始化恩静。我們看下Singleton的設(shè)計(jì):
三:我們看下ActivityManagerProxy的startService與system_server的ActivityManagerService是如何調(diào)用:
來看下ActivityManagerProxy類中的startService:
其中mRemote是IBinder,就是ActivityManagerService的蹲坷,通過Binder驅(qū)動(dòng)走到system_server的ActivityManagerService的onTransact函數(shù)驶乾,
ActivityManagerService的onTransact:
調(diào)用到父類的ActivityManagerNative的onTransact():
startService的標(biāo)示是START_SERVICE_TRANSACTION,之后就走到了ActivityManagerService的startService函數(shù):
就開始走到ActiveServices mServices的startServiceLocked,先分析到這個(gè)循签,我們看下底下這張調(diào)用流程圖: