了解更多开源请访问:51CTO开源基础软件社区https://ost.51cto.com一、前言本文使用PA(服务能力)来计算生肖。UI是一样的,只是计算方式不同。通过本文,您可以了解eTS如何调用JavaAbility,返回JSON字符串结果,并在eTS上展示。由于预览器不支持调用PA,这里使用远程模拟器P40Pro进行开发测试。2.效果3.先讲解如何创建服务能力,如下图:创建服务能力后,config.json中会自动生成如下配置:下面开始讲解如何编写服务能力和计算生肖符号。如果调用JavaAbility之前没有JS经验,可以先看官方文档CallAbility调用基础计算服务示例。这个例子有详细的解释。我也参考了一些文件。当FA请求PA服务时,会调用Ability.connectAbility连接PA。连接成功后,需要在onConnect中返回一个remote对象,供FA向PA发送消息。@OverrideprotectedIRemoteObjectonConnect(Intentintent){super.onConnect(intent);returnremote.asObject();}自己实现Remote对象中的request方法,自定义MyRemote类。类MyRemote扩展RemoteObject实现IRemoteBroker{privatestaticfinalintSUCCESS=0;私有静态最终int错误=1;私有静态最终intPLUS=1001;/***构造方法*/publicMyRemote(){super("MyService_MyRemote");}@OverridepublicbooleanonRemoteRequest(intcode,MessageParceldata,MessageParcelreply,MessageOptionoption)throwsRemoteException{//codeismessageCodeswitch(code){casePLUS:{//读取参数数据StringdataStr=data.readString();HiLog.info(LABEL_LOG,"xx"+dataStr);Mapparam=newHashMap<>();整数年=-1;try{//读入字符串参数转换为Map对象param=ZSONObject.stringToClass(dataStr,Map.class);//从对象中获取参数yearyear=Integer.parseInt(String.valueOf(param.get("year")));HiLog.info(LABEL_LOG,"xx获取年份为:"+year);}catch(RuntimeExceptione){HiLog.error(LABEL_LOG,"转换失败。");}//Java计算十二生肖Stringborn=getBornFromJava(year);//返回结果目前只支持String,复杂结构可以序列化为ZSONStringreportingMapresult=newHashMap<>();result.put("代码",成功);result.put("abilityResult",出生);reply.writeString(ZSONObject.toZSONString(result));休息;}默认值:{Mapresult=newHashMap<>();result.put("代码",错误);result.put("abilityError","服务器繁忙,请稍后再试!!!");reply.writeString(ZSONObject.toZSONString(result));returnfalse;}}returntrue;}@OverridepublicIRemoteObjectasObject(){returnthis;String[]zodiac={"monkey","鸡","狗","猪","鼠","牛","虎","兔","龙","蛇","马","羊"};/***Java计算十二生肖*@paramyear*@return*/privateStringgetBornFromJava(intyear){if(year==-1){return"notavalidyear";}intidx=year%12;returnzodiac[idx];}Java代码的讲解结束了,我们来看看eTS是如何调用刚刚创建的ServiceAbility的,前端调用ServiceAbility,只需修改之前的getBorn函数即可。//计算生肖getBorn(){//在eTS端计算生肖//letidx=this.year%12//this.born=this.zodiac[idx]letthat=this;//调用PA返回十二生肖FeatureAbility.callAbility({bundleName:"com.demo",abilityName:"com.demo.ZodiacServiceAbility",//abilityType:0-Ability;1-内部能力abilityType:0,messageCode:1001,data:{year:this.year},//syncOption(Optional,defaultsync):0-Sync;1-AsyncsyncOption:0}).then((data)=>{console.info("xx返回结果是:“+数据);让jsonObj=JSON.parse(数据);如果(jsonObj.code===0){that.born=jsonObj.abilityResult;}else{AlertDialog.show({消息:jsonObj.abilityError})}})}4、综上所述,ServiceAbility负责计算生肖,而eTS只负责UI,这样就把业务逻辑抽取出来了。比如JavaUI也实现了算生肖的功能,可以调用Service能力的生肖计算方法,分享一下生肖的计算方法。如果把生肖的计算逻辑放在云函数上,那么H5、小程序等都可以调用。了解更多开源内容请访问:51CTO开源基础软件社区https://ost.51cto.com。