android的service大概有這么幾種情勢,Java service ,native service,或Java層通過某種通訊方式比如socket和demon交互.
Java層的aidl很方便,寫socket的demon方式也很好理解,native的就顯得略微麻煩1點,我們通過1個例子來講1下,首先說我們不講授binder的內(nèi)部機制….
我們打算寫個簡單的service,只提供set和get方法
1. 先寫1個bin 的可履行文件
int main(int argc, char** argv)
{
signal(SIGPIPE, SIG_IGN);
sp<ProcessState> proc(ProcessState::self());
sp<IServiceManager> sm = defaultServiceManager();
ALOGI("ServiceManager: %p", sm.get());
sm->addService(String16("service.test"),new Test ());
IPCThreadState::self()->joinThreadPool();
}
sp<IServiceManager> sm = defaultServiceManager();
我們實際得到了servicemanager的binder proxy,通過這個接口我們可以調(diào)用servicemanager的方法addservice.
sm->addService(String16("service.test"),new Test ());
把我們提供的bbinder提供給servicemanager,前面的那個名字必須是唯1的.
IPCThreadState::self()->joinThreadPool();
有了joinThreadPool以后,我們就能夠延續(xù)的提供服務(wù)了.
2 看1下test這個類的實現(xiàn)
test.h
class Test : public BnTest{
public:
inline uint32_t getTest(){
ALOGD("getTest===== %d",IPCThreadState::self()->getCallingUid());
return value;
}
inline void setTest(uint32_t par){
ALOGD("setTest===== %d",IPCThreadState::self()->getCallingUid());
value = par;
}
private:
uint32_t value;
};
我們的test類是繼承了BnTest,它是具體的干活的類
ITest.h
class ITest : public IInterface{
public:
DECLARE_META_INTERFACE(Test);
virtual uint32_t getTest() = 0;
virtual void setTest(uint32_t ) = 0;
};
class BnTest : public BnInterface<ITest>{
public:
virtual status_t onTransact(uint32_t code,
const Parcel& data,
Parcel* reply,
uint32_t flags= 0 );
};
ITest就相當(dāng)因而aidl的接口定義了
ITest.cpp
enum{
GET_Test = 1,
SET_Test,
};
class BpTest: public BpInterface<ITest>{
public:
BpTest(const sp<IBinder>& impl)
: BpInterface<ITest>(impl){
}
virtual uint32_t getTest(){
Parcel data,reply;
data.writeInterfaceToken(ITest::getInterfaceDescriptor());
remote()->transact(GET_Test,data,&reply);
return reply.readInt32();
}
virtual void setTest(uint32_t params){
Parcel data,reply;
data.writeInterfaceToken(ITest::getInterfaceDescriptor());
data.writeInt32(params);
remote()->transact(SET_Test,data,&reply);
return;
}
};
IMPLEMENT_META_INTERFACE(Test,"android.Test.ITest");
status_t BnTest::onTransact(uint32_t code,
const Parcel& data,
Parcel* reply,
uint32_t flags){
switch(code){
case GET_Test:{
CHECK_INTERFACE(ITest,data,reply);
reply->writeInt32(getTest());
return NO_ERROR;
}break;
case SET_Test:{
CHECK_INTERFACE(ITest,data,reply);
uint32_t value = data.readInt32();
setTest(value);
return NO_ERROR;
}break;
default:
return BBinder::onTransact(code, data, reply, flags);
}
}
而ITest幾近也是照著模板寫的,Google自己肯定寫了類似于aidl的工具來生成native的service.