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