一、源代码版本
源代码版本: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