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.
94 lines
2.6 KiB
94 lines
2.6 KiB
---
|
|
系统服务和 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();
|
|
}
|
|
```
|
|
|
|
|