我的Android开源之旅

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

2019-11-16  本文已影响0人  xuexiangjys

Service的启动过程

Service的启动和根Activity的启动很类似。Service的启动同样需要保证该应用程序的进程已经被启动。

启动大纲

  1. ContextImpl请求AMS启动Service.

  2. AMS请求ActivityThread启动Service.


ContextImpl请求AMS启动Service

在这里插入图片描述

AMS请求ActivityThread启动Service

在这里插入图片描述

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

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

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

(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

在这里插入图片描述

AMS请求ActivityThread处理Service绑定

在这里插入图片描述 在这里插入图片描述

与Service绑定相关的对象类型介绍:

上一篇 下一篇

猜你喜欢

热点阅读