Binder机制编程
(1)添加新建的服务名称
static struct {
unsigned uid;
const char *name;
} allowed[] = {
#ifdef LVMX
{ AID_MEDIA, "com.lifevibes.mx.ipc" },
#endif
{ AID_MEDIA, "media.audio_flinger" },
{ AID_MEDIA, "media.player" },
{ AID_MEDIA, "media.camera" },
{ AID_MEDIA, "media.audio_policy" },
{ AID_RADIO, "radio.phone" },
{ AID_RADIO, "radio.sms" },
{ AID_RADIO, "radio.phonesubinfo" },
{ AID_RADIO, "radio.simphonebook" },
{ AID_RADIO, "phone" },
{ AID_RADIO, "isms" },
{ AID_RADIO, "iphonesubinfo" },
{ AID_RADIO, "simphonebook" },
{AID_NEW, "newservice"}
};
(2)定义ImyService类
Class ImyService:public IInterface
{
Public:
DECLARE_META_INTERFACE(MyService);
Virtual fun1() = 0;
Virtual fun2() = 0;
}
(3)定义一个本地实现类BnMyService
Class BnMyService:public BnInterface
{
Public:
Virtual status_t onTransact(uint32_t code,
const Parcel& data,
Parcel* reply,
uint32_t flags = 0);
}
(4)定义本地代理类BpMyService
class BpMyService: public BpInterface
{
public:
BpMyService(const sp& impl)
: BpInterface(impl)
{
}
void fun1()
{
Parcel data, reply;
…… //数据写入
remote()->transact(枚举量, data, &reply);
return …… //数据返回
}
……
}
(5)加入宏定义
IMPLEMENT_META_INTERFACE(MyService, "XXX");
(6)定义BnMyService的onTransact()函数
status_t BnMyService::onTransact(
uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
switch(code) { //code功能代码枚举量
case功能代码枚举量: {
LOGV("NOTIFY_CALLBACK");
CHECK_INTERFACE(ICameraClient, data, reply); //检查描述符字符串
…… //参数输入,接口函数功能的真正实现
reply->……); //返回数据
return NO_ERROR;
} break;
……
default:
return BBinder::onTransact(code, data, reply, flags);
}
}
(7)创建真正的本地接口实现类MyService类
Class MyService:public BnMyService
{
Public:
Static void instantiate();
Virtual func1();
Virtual func2();
……
}
(8)定义MyService::instantiate()函数
void MyService::instantiate() {
defaultServiceManager()->addService(
String16("newservice"), new MyService());
}
(9)服务进程中注册服务
int main(int argc, char** argv)
{
sp proc(ProcessState::self());
sp sm = defaultServiceManager();
LOGI("ServiceManager: %p", sm.get());
MyService::instantiate();
……
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
(10)客户端获取服务代理对象
const sp& MyServiceSystem::get_MyService()
{
Mutex::Autolock _l(mLock);
if (gMyService.get() == 0) {
sp sm = defaultServiceManager(); //获取服务管家的代
//理对象
sp binder;
do {
binder = sm->getService(String16("newservice")); //查找到服务后,
//返回服务的代理对象
……
} while(true);
……
gMyService = interface_cast(binder); //将其转换为本地服
//务代理对象(BpMyService)
……
}
……
return mMyService;
}
(11)客户端调用服务端函数
服务端进程A从binder驱动中读取数据,然后处理远程调用,然后发送reply数据给binder驱动。binder驱动将reply传递给客户端进程B。进程B从binder驱动中读取数据并最终获取到reply,从而完成进程通信。
Status_t MyServiceSystem::func1()
{
Const sp& af = MyServiceSystem::get_MyService();
Af::Func1();
……
}