From 6f32d56f21e071088cf8f9ea67dbfd04cf575f0d Mon Sep 17 00:00:00 2001 From: Omooo <869759698@qq.com> Date: Wed, 18 Mar 2020 06:52:12 +0800 Subject: [PATCH] =?UTF-8?q?Create=20=E7=B3=BB=E7=BB=9F=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=92=8C=E5=BA=94=E7=94=A8=E6=9C=8D=E5=8A=A1=E7=9A=84=E5=8C=BA?= =?UTF-8?q?=E5=88=AB.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../系统服务和应用服务的区别.md | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 blogs/Android/Framework/系统服务和应用服务的区别.md 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(); +} +``` +