返回

Binder入门(四) ServiceManager

闲谈

ServiceManager

在 Binder 架构中,ServiceManager 是一个特殊的 Service,主要负责协调不同进程中的服务对象。ServiceManager 本身就是一个系统服务,启动后它会在自己的进程中监听来自其他进程的请求,并根据请求转发到对应的 Service。
要获取 ServiceManager 对象,可以使用以下代码:

IServiceManager sm = ServiceManager.getService("service_manager");

注意,由于 ServiceManager 是一个系统服务,所以在任何进程中都可以获取它。

ServiceManager 实现了 IServiceNameLookup 接口,该接口定义了一个 lookup 方法,用于查找指定 Service 的 IBinder 对象。我们可以通过如下代码来查找某个 Service:

IBinder b = sm.getService(name);

如果 Service 存在,就会返回它的 IBinder 对象,否则返回 null。

需要注意的是,ServiceManager 并不是一个普通的 Service,它没有自己的进程,而是运行在 init 进程中。因此,在使用 ServiceManager 时,需要考虑以下几点:

  • ServiceManager 的生命周期与 init 进程的生命周期是一致的,这意味着 ServiceManager 会在 init 进程启动后启动,并在 init 进程退出后退出。
  • ServiceManager 不能被其他进程杀死,因为它是 init 进程的一部分。
  • ServiceManager 不支持跨进程调用,这意味着只能在 init 进程中使用 ServiceManager。

ServiceManager的工作原理

ServiceManager 是一个进程间通信(IPC)机制,它允许不同的进程相互通信。ServiceManager 的工作原理如下:

  1. ServiceManager 在 init 进程中启动。
  2. ServiceManager 创建一个监听端口,并等待来自其他进程的请求。
  3. 当其他进程想要连接到 ServiceManager 时,会向 ServiceManager 的监听端口发送一个请求。
  4. ServiceManager 收到请求后,会创建一个新的连接,并将该连接添加到连接列表中。
  5. 当其他进程想要获取某个 Service 的 IBinder 对象时,会向 ServiceManager 发送一个请求。
  6. ServiceManager 收到请求后,会查找连接列表中对应的连接,并将 IBinder 对象发送给该进程。

ServiceManager的使用

ServiceManager 的使用非常简单,只需以下几个步骤:

  1. 获取 ServiceManager 对象。
  2. 通过 ServiceManager 对象查找某个 Service 的 IBinder 对象。
  3. 使用 IBinder 对象来调用 Service 的方法。

以下是使用 ServiceManager 的示例代码:

IServiceManager sm = ServiceManager.getService("service_manager");
IBinder b = sm.getService("MyService");
IMyService service = IMyService.Stub.asInterface(b);
service.doSomething();

总结

ServiceManager 是一个进程间通信机制,它允许不同的进程相互通信。ServiceManager 的工作原理是:它在 init 进程中启动,并创建一个监听端口,等待来自其他进程的请求。当其他进程想要连接到 ServiceManager 时,会向 ServiceManager 的监听端口发送一个请求。ServiceManager 收到请求后,会创建一个新的连接,并将该连接添加到连接列表中。当其他进程想要获取某个 Service 的 IBinder 对象时,会向 ServiceManager 发送一个请求。ServiceManager 收到请求后,会查找连接列表中对应的连接,并将 IBinder 对象发送给该进程。ServiceManager 的使用非常简单,只需以下几个步骤:获取 ServiceManager 对象,通过 ServiceManager 对象查找某个 Service 的 IBinder 对象,使用 IBinder 对象来调用 Service 的方法。