学习一个应用,首先从怎么使用开始,下面主要从 server 和 cilent 两方向开始。
一、服务端怎么使用?
#include "ITest.h"
int main()
{
// 获取一个 ProcessState 实例
// 每一个进程 只有 ProcessState 独一无二
// 三个过程
// 1. 单例模式
// 2. 构造
// 3. 打开 binder,mmap 分配一段内存接收数据
sp<ProcessState> proc(ProcessState::self());
// sm client 注册 得到IServiceManager
// 得到IServiceManager ,与另外一个进程 ServiceManager 通讯
p<IServiceManager> sm = defaultServiceManager();
sm->addService("name", new Test);
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
二、客户端怎么使用?
#include "ITest.h"
int main() {
//获取service manager引用
sp < IServiceManager > sm = defaultServiceManager();
//获取名为"service.myservice"的binder接口
sp < IBinder > binder = sm->getService(String16("name"));
//将biner对象转换为强引用类型的IMyService
sp<IMyService> cs = interface_cast < IMyService > (binder);
//利用binder引用调用远程sayHello()方法
cs->sayHello();
return 0;
}
三、客户端怎么发送数据到服务端?
想理解下面的代码,建议阅读 Transact 个 onTransact 这个函数的使用说明。
(1)ITest.h
namespace android
{
// 第一: 申明IMyService
class ITest : public IInterface
{
public:
DECLARE_META_INTERFACE(Test); //使用宏,申明Test
virtual void sayHello()=0; //定义方法
};
//定义命令字段
enum
{
HELLO = 1,
};
// 第二:申明客户端 BpTest
class BpTest: public BpInterface<ITest> {
public:
BpTest(const sp<IBinder>& impl);
virtual void sayHello();
};
//第三:申明服务端BnTest
class BnTest: public BnInterface<ITest> {
public:
virtual status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0);
virtual void sayHello();
};
}
(2) ITest.cpp
#include "IMyService.h"
namespace android
{
//使用宏,完成MyService定义
IMPLEMENT_META_INTERFACE(Test, "ITest");
//客户端
BpTest::BpTest(const sp<IBinder>& impl) :
BpInterface<ITest>(impl) {
}
// 实现客户端sayHello方法
void BpTest::sayHello() {
printf("BpMyService::sayHello\n");
Parcel data, reply;
data.writeInterfaceToken(ITest::getInterfaceDescriptor());
remote()->transact(HELLO, data, &reply);
printf("get num from BnTest: %d\n", reply.readInt32());
}
//服务端,接收远程消息,处理onTransact方法
status_t BnTest::onTransact(uint_t code, const Parcel& data,
Parcel* reply, uint32_t flags) {
switch (code) {
case HELLO: { //收到HELLO命令的处理流程
printf("BnMyService:: got the client hello\n");
CHECK_INTERFACE(ITest, data, reply);
sayHello();
reply->writeInt32(2015);
return NO_ERROR;
}
break;
default:
break;
}
return NO_ERROR;
}
// 实现服务端sayHello方法
void BnTest::sayHello() {
printf("BnMyService::sayHello\n");
};
}