美文网首页源码分析@IT·互联网Android知识
startService源码从应用主进程到AMS进程的过程分析及

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

作者: umbrella1 | 来源:发表于2017-05-17 20:23 被阅读86次

    从三个流程上来分析:

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

    相关文章

      网友评论

      本文标题:startService源码从应用主进程到AMS进程的过程分析及

      本文链接:https://www.haomeiwen.com/subject/gbvctxtx.html