源码分析@IT·互联网Android知识

startService源码从应用主进程到AMS进程的过程分析及

2017-05-17  本文已影响86人  umbrella1

从三个流程上来分析:

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

上一篇下一篇

猜你喜欢

热点阅读