You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
android-notes/blogs/Android/Framework/系统服务和应用服务的区别.md

2.6 KiB

系统服务和 bind 的应用服务有什么区别?
  1. 启动方式有什么区别?
  2. 注册方式有什么区别?
  3. 使用方式有什么区别?

启动方式

系统服务的启动

系统服务(AMS、WMS、PMS)大多都是跑在 SystemService 里面的,也是在 SystemServer 里面启动的。

private void run() {
	//...
	startBootstrapServices();
	startCoreServices();
	startOtherServices();
}

大多数的服务都是跑在 Binder 线程里的,只有少数服务会有自己的工作线程。

这里的启动服务到底是什么意思呢?

主要是做一些服务的初始化工作,比如说准备好服务的 binder 实体对象,当 Client 有请求进来时,就会在 Binder 线程池里面把请求分发到对应的 binder 实体对象来进行处理,处理完成之后在发送回复给 Client,这就是系统服务的启动。

当然,有些系统服务不在 SystemServer 里面,它自己单独开了一个进程,这种服务一般都是 native 实现的,有自己的 main 入口函数,需要自己去启动 binder 机制,去管理 binder 通信。但是它同样要有自己的 binder 实体对象、binder 线程,然后 binder 线程等待 Client 请求,再分发给 binder 实体对象。

应用服务的启动

ComponmentName startServiceCommon(Intent service, ...) {
	//...
	ActivityManagerNative.getDefault().startService(...);
}

AMS 只是负责管理和调度 Service,真正的启动还是在应用端来做:

private void handleCreateService(CreateServiceData data) {
	Service service = (Service)cl.loadClass(data.info.name).newInstance();
	ContextImpl context = ContextImpl.createAppContext(this, ...);
	Application app = packageInfo.makeApplication(false, ...);
	service.attach(context, this,...);
	service.onCreate();
}

注册方式

系统服务的注册

// java 层实现
public void setSystemProcess() {
	ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);
	//...
}
// native 层实现
int main(int, char**) {
	//...
	sp<IServiceManager> sm(defaultServiceManager());
	sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false);
}

应用服务的注册

应用服务注册

使用方式

系统服务的使用

PowerManager pm = context.getSystemService(Context.POWER_MANAGER);

应用服务的使用

bindService(serviceIntent, new ServiceConnection()) {
	public void onServiceConnected();
	public void onServiceDisconnected();
}