parent
42e3500b4f
commit
6f32d56f21
@ -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<IServiceManager> 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(); |
||||||
|
} |
||||||
|
``` |
||||||
|
|
Loading…
Reference in new issue