Android源码分析--Service的启动和绑定

  • AMSstartService 方法中调用 ActiveServicestartServiceLocked 方法,其中调用 retrieveServiceLocked 用于获取启动服务的Intent参数所对应的 ServiceRecord ,它主要用于描述一个Service,启动Service所必须的参数。

  • 在ActiveService的 startServiceLocked 方法中获取到相应的 ServiceRecord 之后,就会调用其自身的 startServiceInnerLocked 方法,而它又会去调用 bringUpServiceLocked 方法。在 bringUpServiceLocked 方法中主要做了以下三个工作:

(1)获取Service运行所在的进程。

(2)如果Service运行所在的应用程序进程 ProcessRecord 存在,则调用其自身的 realStartServiceLocked 方法来启动Service.

(3)如果Service运行所在的应用程序进程 ProcessRecord 不存在,则需要调用AMS的 startProcessLocked 方法来启动应用程序进程。

  • ActiveServicerealStartServiceLocked 方法中,会使用 ProcessRecordIApplicationThread 类型的引用(实现类是ActivityThread的内部类ApplicationThread),调用其 scheduleCreateService 方法。

  • 在ActivityThread的 scheduleCreateService 方法中,会向其内部类并继承自Handler的 H 发送 CREATE_SERVICE 消息,并由 H 进行处理,最终会调用 handleCreateService 方法。

  • ActivityThreadhandleCreateService 方法中主要做了如下几件事:

(1)获取要启动Service的应用程序的LoadApk(包信息),并通过它获取类的加载器,通过反射创建Service的实例。

(2)调用 ContextImplcreateAppContext 方法,为Service创建上下文环境ContextImpl对象。

(3)调用 Serviceattach 方法,对Service进行初始化。

(4)调用 ServiceonCreate 方法,这样Service就启动了。

Service的绑定过程

除了使用Context的startService来启动Service外,我们也可以通过Context的bindService来绑定Service。绑定Service的过程要比启动Service的过程复杂一些。

启动大纲

  1. ContextImpl请求AMS绑定Service.

  2. AMS请求ActivityThread处理Service绑定.

  3. AMS进行Service的绑定.

ContextImpl请求AMS绑定Service

  • 当我们需要绑定一个Service时,我们会使用 context.bindService 。而Context只是一个抽象的类,它的实现是在 ContextWrapper 中。

  • 在ContextWrapper的 bindService 方法中,又会调用其内部的Context类型的mBase变量,而该变量的创建详见 ActivityThreadcreateBaseContextForActivity 方法,它的实现类是 ContextImpl

  • ContextImplbindService 方法中,又会调用其自身的 bindServiceCommon 方法。

  • ContextImplbindServiceCommon 方法中,首先调用 LoadedApkgetServiceDispatcher 方法获取ServiceConnection的封装类(本地的代理) IServiceConnection (用于跨进程通信),然后使用 ActivityManager 获取AMS的代理 IActivityManager ,调用其 bindService 方法并将 IServiceConnection 对象传入。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章