startService源码从应用主进程到AMS进程的过程分析及涉及装饰、代理、单利设计模式

从三个流程上来分析:

一、从activity的startService到ContextImpl的大概流程,涉及到装饰模式:

在Activity类中实现startService(),

startService源码从应用主进程到AMS进程的过程分析及涉及装饰、代理、单利设计模式_第1张图片

从类图关系中,Activity继承了ContextThemeWrapper,ContextThemeWrapper继承ContextWrapper类,所以startService在ContextWrapper类startService函数,我们看下ContextWrapper中startService函数:

ContextWrapper类:


有一个成员变量mBase,它是一个ContextImpl实例,最终startService走到ContextImpl类中:


startService源码从应用主进程到AMS进程的过程分析及涉及装饰、代理、单利设计模式_第2张图片

这几个类设计是典型的装饰模式(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的初始:

看下这源码:


startService源码从应用主进程到AMS进程的过程分析及涉及装饰、代理、单利设计模式_第3张图片

红框是创建activity,继续看


startService源码从应用主进程到AMS进程的过程分析及涉及装饰、代理、单利设计模式_第4张图片

CreateBaseContextForActivity创建ContextImpl,并把activity设置为outerContext的:


startService源码从应用主进程到AMS进程的过程分析及涉及装饰、代理、单利设计模式_第5张图片

接着实行activity类中的attach函数,这个attach会关联Ativity、Window(phoneWindow)、WindowManager:


startService源码从应用主进程到AMS进程的过程分析及涉及装饰、代理、单利设计模式_第6张图片

通过attachBaseContext(context)把ContextImpl设置到父类ContextWrapper的mBase。

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


startService源码从应用主进程到AMS进程的过程分析及涉及装饰、代理、单利设计模式_第7张图片

我们抽离看ContextImpl的startService开始:

ContextImpl类:



startService源码从应用主进程到AMS进程的过程分析及涉及装饰、代理、单利设计模式_第8张图片

我们接着看ActivityManageNative类中的getDefault:


startService源码从应用主进程到AMS进程的过程分析及涉及装饰、代理、单利设计模式_第9张图片


startService源码从应用主进程到AMS进程的过程分析及涉及装饰、代理、单利设计模式_第10张图片

这AcivityManagerNative、ActivityManagerProxy就是典型的代理模式,AcivityManagerNative把一些工作委托给ActivityManagerProxy来做。

这里面gDefault.get()是一个单例的助手类延迟初始化。我们看下Singleton的设计:


startService源码从应用主进程到AMS进程的过程分析及涉及装饰、代理、单利设计模式_第11张图片

三:我们看下ActivityManagerProxy的startService与system_server的ActivityManagerService是如何调用:

来看下ActivityManagerProxy类中的startService:


startService源码从应用主进程到AMS进程的过程分析及涉及装饰、代理、单利设计模式_第12张图片

其中mRemote是IBinder,就是ActivityManagerService的,通过Binder驱动走到system_server的ActivityManagerService的onTransact函数,

ActivityManagerService的onTransact:


startService源码从应用主进程到AMS进程的过程分析及涉及装饰、代理、单利设计模式_第13张图片

调用到父类的ActivityManagerNative的onTransact():


startService源码从应用主进程到AMS进程的过程分析及涉及装饰、代理、单利设计模式_第14张图片


startService源码从应用主进程到AMS进程的过程分析及涉及装饰、代理、单利设计模式_第15张图片

startService的标示是START_SERVICE_TRANSACTION,之后就走到了ActivityManagerService的startService函数:


startService源码从应用主进程到AMS进程的过程分析及涉及装饰、代理、单利设计模式_第16张图片

就开始走到ActiveServices mServices的startServiceLocked,先分析到这个,我们看下底下这张调用流程图:


startService源码从应用主进程到AMS进程的过程分析及涉及装饰、代理、单利设计模式_第17张图片

你可能感兴趣的:(startService源码从应用主进程到AMS进程的过程分析及涉及装饰、代理、单利设计模式)