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


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容