Android学习笔记:Android10.0.+版本下Service的工作过程(流程分析文档)

一、源代码版本

源代码版本:Source for Android 30 (Android10.0+(R))

Service有两种工作状态,一种是启动状态,主要用于执行后台计算;另一种是绑定状态,主要用于和其他人组件和Service交互。需要注意的是,Service的这两种状态是可以共存的,即Service即可以处于启动状态又可以处于绑定状态。

二、Service的启动状态

首先,我们编写一个ServiceDemo,该工程下有一个Activity即MainActivity,和一个Service即MyService,还有一个布局文件activity_main.xml。

 

在MainActivity中,通过ContextWrapper#startService()方法可以启动一个Service,如下图所示。

我们进入ContextWrapper类的startService()方法,如下图所示,在startService()方法中,mBase的类型是Context的子类ContextImpl。从ContextWrapper类的实现可以看出,其大部分操作都是通过mBase来实现的,在设计模式中,这是一种桥接模式

接下来,进入Context类的startService()方法,如下图所示。

可以看出在Context类中,定义了抽象的startService()方法,而mBase的类型是Context的子类ContextImpl,ContexImpl类继承了Context类并重写了startService()方法。

可以看出ContextImpl#startService()方法回调了ContextImpl#startServiceCommon()方法,进入startServiceCommon()方法,如下图所示。

startServiceCommon()方法通过ActivityManager.getService()这个对象来启动一个服务,这个对象我们在Activity的工作过程中也遇到过,其实质是AMS(ActivityManagerService)。我们通过ActivityManager.getService()方法跳转到AcitvityManager类,如下图所示。

可以看出,ActivityManager#getService()方法返回的是IActivityManagerSingleton对象的get()方法,该返回值是一个IBinder对象,跳转查看。

可以看到IActivityManagerSingleton对象的类型是IActivityManager,在IActivityManager类中,Singleton是一个单例的封装类,第一次调用它的get()方法时,它会通过create()方法来初始化IBinder对象,在后续的调用中则直接返回之前创建的对象,而通过create()方法,getService()获取了IActivityManager

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值