Binder是Android上IPC的基础和关键。那么在使用过程中,大多数时候看到的是client与server的结构,即Server通过创建服务来向Client提供服务,Client则通过绑定到Binder对象从而开始通信。
具体的binder对象的获取方式,也就与服务的调用方式相关了:
1.使用startService
与指定service关联
Intent intent =newIntent("com.example.bindser.JNIProxyService");
startService(intent);
2.使用bindService
与指定service关联
Intent intent =newIntent("com.example.binderserver.JNIProxyService");
bindService(intent, mConn, BIND_AUTO_CREATE);
3.直接获取指定系统服务的binder对象
如下时native中获取的方式,java类似。
sp<IServiceManager> sm = defaultServiceManager();
binder = sm->getService(String16("zp.svc"));
Parcel data, reply;
data.writeInt32(getpid());
data.writeInt32(n);
binder->transact(0, data,&reply);
int r = reply.readInt32();
需要注意的是,上面这个例子针对的时native的service,如果service本身时java开发,则如上调用会失败,原因时通信过程中会遵循一个简单的协议,可以通过reverser analyze Java Interface
.
参考
1. http://m.blog.csdn.net/blog/blackboyofsnp/7243070
2. http://m.blog.csdn.net/blog/longfeey/5887026