ServiceManager.getService("activity") 获取IBinder 源码分析
时间: 2024-06-09 08:05:04 浏览: 226
在 Android 中,ServiceManager 是一个系统级的服务管理器,用于管理系统中的各种服务。其中,getService() 方法用于获取已经注册到 ServiceManager 中的服务,返回的是该服务所对应的 IBinder 对象。
具体来说,getService() 方法的实现位于 frameworks/native/libs/binder/IServiceManager.cpp 文件中,其源码如下:
```c++
sp<IBinder> IServiceManager::getService(const String16& name)
{
Parcel data, reply;
data.writeInterfaceToken(IServiceManager::getInterfaceDescriptor());
data.writeString16(name);
remote()->transact(GET_SERVICE_TRANSACTION, data, &reply);
return checkService(reply.readStrongBinder());
}
```
其中,`remote()` 方法返回的是一个 IBinder 对象,表示当前进程与 ServiceManager 进程之间的 Binder 通信管道。`transact()` 方法用于向 ServiceManager 发送 GET_SERVICE_TRANSACTION 消息,该消息中包含了要获取的服务的名称。ServiceManager 接收到消息后,会查找该名称对应的服务,然后将该服务的 IBinder 对象作为响应返回给调用者。最后,checkService() 方法用于检查返回的 IBinder 对象是否有效,如果有效则直接返回该对象。
总结起来,getService() 方法的实现就是向 ServiceManager 发送一条消息,请求获取指定名称的服务所对应的 IBinder 对象。
阅读全文