diff --git a/blogs/Android/Framework/系统服务和应用服务的区别.md b/blogs/Android/Framework/系统服务和应用服务的区别.md new file mode 100644 index 0000000..fc1f513 --- /dev/null +++ b/blogs/Android/Framework/系统服务和应用服务的区别.md @@ -0,0 +1,94 @@ +--- +系统服务和 bind 的应用服务有什么区别? +--- + +1. 启动方式有什么区别? +2. 注册方式有什么区别? +3. 使用方式有什么区别? + +#### 启动方式 + +**系统服务的启动** + +系统服务(AMS、WMS、PMS)大多都是跑在 SystemService 里面的,也是在 SystemServer 里面启动的。 + +```java +private void run() { + //... + startBootstrapServices(); + startCoreServices(); + startOtherServices(); +} +``` + +大多数的服务都是跑在 Binder 线程里的,只有少数服务会有自己的工作线程。 + +这里的启动服务到底是什么意思呢? + +主要是做一些服务的初始化工作,比如说准备好服务的 binder 实体对象,当 Client 有请求进来时,就会在 Binder 线程池里面把请求分发到对应的 binder 实体对象来进行处理,处理完成之后在发送回复给 Client,这就是系统服务的启动。 + +当然,有些系统服务不在 SystemServer 里面,它自己单独开了一个进程,这种服务一般都是 native 实现的,有自己的 main 入口函数,需要自己去启动 binder 机制,去管理 binder 通信。但是它同样要有自己的 binder 实体对象、binder 线程,然后 binder 线程等待 Client 请求,再分发给 binder 实体对象。 + +**应用服务的启动** + +```java +ComponmentName startServiceCommon(Intent service, ...) { + //... + ActivityManagerNative.getDefault().startService(...); +} +``` + +AMS 只是负责管理和调度 Service,真正的启动还是在应用端来做: + +```java +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 +// java 层实现 +public void setSystemProcess() { + ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true); + //... +} +``` + +```c +// native 层实现 +int main(int, char**) { + //... + sp sm(defaultServiceManager()); + sm->addService(String16(SurfaceFlinger::getServiceName()), flinger, false); +} +``` + +**应用服务的注册** + +![应用服务注册](/Users/omooo/Downloads/应用服务注册.png) + +#### 使用方式 + +**系统服务的使用** + +```java +PowerManager pm = context.getSystemService(Context.POWER_MANAGER); +``` + +**应用服务的使用** + +```java +bindService(serviceIntent, new ServiceConnection()) { + public void onServiceConnected(); + public void onServiceDisconnected(); +} +``` +