从三个流程上来分析:
一、从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,先分析到这个,我们看下底下这张调用流程图: