Android的IPC机制——Binder (2) http://blog.sina.com.cn/s/blog_40e9d4dd0100xifg.html2)服务端代理对象BpBinderBpBinder是服务端代理对象,即远程对象在当前进程的代理。实际上,它也是Binder通信存在于客户端的进程,它实现了IBinder接口,它的transact函数的实现如代码清单3-47所示。代码清单3-47 BpBinder::transact的实现status_t BpBinder::transact( uint32_t code, const Parcel& data, Parcel reply, uint32_t flags) { // Once a binder has died, it will never come back to life. if (mAlive) { status_t status = IPCThreadState::self()->transact( mHandle, code, data, reply, flags); if (status == DEAD_OBJECT) mAlive = 0; return status; } return DEAD_OBJECT; } 该函数的参数分别为请求的ID号、请求的参数、返回的结果、额外的标识(通常为0)。它实际上只是简单地调用了IPCThreadState::self()的transact函数,将请求通过内核模块发送给了服务端,服务端处理完请求之后,沿原路返回结果给调用者。注意 transact方法是同步方法,将会挂起客户进程的当前线程,直到Service把请求处理完成并返回结果。
http://blog.sina.com.cn/s/blog_40e9d4dd0100xifg.html2)服务端代理对象BpBinderBpBinder是服务端代理对象,即远程对象在当前进程的代理。实际上,它也是Binder通信存在于客户端的进程,它实现了IBinder接口,它的transact函数的实现如代码清单3-47所示。代码清单3-47 BpBinder::transact的实现status_t BpBinder::transact(
uint32_t code, const Parcel& data, Parcel
reply, uint32_t flags)
{
// Once a binder has died, it will never come back to life.
if (mAlive) {
status_t status = IPCThreadState::self()->transact(
mHandle, code, data, reply, flags);
if (status == DEAD_OBJECT) mAlive = 0;
return status;
}
return DEAD_OBJECT;
}
该函数的参数分别为请求的ID号、请求的参数、返回的结果、额外的标识(通常为0)。它实际上只是简单地调用了IPCThreadState::self()的transact函数,将请求通过内核模块发送给了服务端,服务端处理完请求之后,沿原路返回结果给调用者。注意 transact方法是同步方法,将会挂起客户进程的当前线程,直到Service把请求处理完成并返回结果。
http://blog.sina.com.cn/s/blog_40e9d4dd0100xiee.html