1.它们在启动方式上有什么区别
2.它们在注册方式上有什么区别
3.它们在使用方式上有什么区别
系统服务大多数是跑在SystemServer里的,也是在SystemServer里启动的,比如AMS,PMS,WMS等,大部分系统服务都是跑在binder线程里的,只有少部分的系统服务才会有自己的工作线程,启动服务主要是做一些服务的初始化工作,比如说准备好服务的binder实体对象,当client有请求过来时,就会在binder线程池里把请求分发给对应的binder实体对象,来进行处理,处理完之后再去发送回复给client,这就是系统服务的启动。跑在自己的工作线程中的系统服务一般都是native实现,有自己的main入口函数,需要自己去启动binder机制,去管理binder通信,它一样要有自己的binder实体对象,和之前的启动过程是一样的。
应用服务启动 startServiceCommon(Intent service) -> ActivityManagerNative.getDefault().startService(service)->
handleCreateService(CreateServiceData data)
AMS它只负责service的管理和调度,真正的service启动还是在应用端完成的。
应用端:首先通过ClassLoad去加载service的类,然后newInstance()去构造service对象,然后给service创建上下文,准备Application,给service赋予上下文,最后进行service的生命周期回调。
系统服务的注册无论你是跑在SystemServer进程还是一个单独进程的服务都是要给自己的binder实体对象注到ServiceManager的。
应用服务的注册:首先应用向AMS发起bindServiec调用,AMS会看应用是否注册过,如果注册过,就直接给service的binder对象返回给应用,如果没注册过,AMS就会请求binder对象,Service就会响应这个请求,给自己的binder对象注册到AMS,然后AMS再把binder对象回调给应用。
应用服务是一个典型的被动注册,一般是由应用来bindService。
系统服务的使用可参见上篇文章 ServiceFetcher
应用服务的使用,bindService(serviceIntent,new ServiceConnectioin(){})
在回调的onServiceConnected函数中会返回一个binder对象,通过binder对象封装了一层业务接口对象 ,就可以通过业务接口对象使用这个应用服务了。
网友评论