💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
纯Native的Service表示我们的代码都在Native层。Native层有很多service,前面的MS不就是一个重量级的吗? 假设service叫Test,我们该如何实现呢?完全可以模仿MS!具体实现过程,如代码所示: **Test.cpp::范例** ~~~ int main() { sp<ProcessState>proc(ProcessState::self()); sp<IServiceManager> sm =defaultServiceManager(); //记住注册你的服务,否则谁也找不着你! sm->addService(“service.name”,newTest()); //如果压力不大,可以不用单独搞一个线程。 ProcessState::self()->startThreadPool(); //这个是必需的,否则主线程退出了,你也完了。 IPCThreadState::self()->joinThreadPool(); } ~~~ Test是怎么定义的呢?我们是跨进程的C/S,所以本地需要一个BnTest,对端需要提供一个代理BpTest。为了不暴露Bp的身份,Bp的定义和实现都放在BnTest.cpp中好了。 注意:你虽可以暴露Bp的身份(输出它的头文件),但也没有必要,因为客户端用的是基类ITest指针。 1. 我能干什么 ITest接口表明它所提供的服务,例如getTest和setTest等,这个与业务逻辑相关,代码如下所示: 说明:getTest也可以返回一个ITestService类型的Service! **ITest.h::声明ITest** ~~~ /需要从IInterface派生 class ITest: public IInterface { public: //神奇的宏 DECLARE_META_INTERFACE DECLARE_META_INTERFACE(Test); virtualvoid getTest() = 0; virtual voidsetTest() = 0; }//ITest是一个接口类。 ~~~ 2. 定义BnTest和BpTest 为了把ITest融入到Binder系统,需要定义BnTest和对客户端透明的BpTest。BnTest定义既可以与上面的Test定义放在一块,也可以分开,如下所示: **ITest.h::声明BnTest** ~~~ class BnTest: public BnInterface<ITest> { public: //由于ITest是个纯虚类,而BnTest只实现了onTransact函数,所以BnTest依然是一个纯虚类 virtualstatus_t onTransact( uint32_t code, constParcel& data, Parcel*reply, uint32_t flags = 0); }; ~~~ 另外,我们还要使用IMPLEMNT宏。参考BnMediaPlayerService的方法,把BnTest和BpTest的实现都放在ITest.cpp中,如下所示: **ITest.cpp::BnTest的实现** ~~~ IMPLEMENT_META_INTERFACE(Test, "android.Test.ITest");//IMPLEMENT宏 status_t BnTest::onTransact( uint32_tcode, const Parcel& data, Parcel* reply, uint32_t flags) { switch(code) { case GET_Test:{ CHECK_INTERFACE(ITest, data, reply); getTest();//子承父业,由Test完成。 return NO_ERROR; }break; //SET_XXX类似 ~~~ BpTest也在这里实现吧,如下所示: **ITest.cpp::BpTest的实现** ~~~ class BpTest: public BpInterface<ITest> { public: BpXXX(const sp<IBinder>& impl) :BpInterface< ITest >(impl) { } vitural getTest() { Parcel data, reply; data.writeInterfaceToken(ITest::getInterfaceDescriptor()); data.writeInt32(pid); //打包请求数据,然后交给BpBinder通讯层处理。 remote()->transact(GET_Test, data, &reply); return; } //setTest类似 ~~~ 纯Native的Service写起来量大一些,上面的代码还只是把C/S的框架写好了,真实的业务处理尚未开始,不过感觉却很踏实,很厚重。那么,Java层的Service该怎么写呢?