当前位置: 首页 > 科技观察

JSFA调用PA的第三种Ability调用方法

时间:2023-03-20 12:40:25 科技观察

更多内容请访问:与华为官方共同建立的鸿蒙技术社区https://harmonyos.51cto.com简介【FFH】JSFA调用PA(一)Ability的概念与Ability与InternalAbility【FFH】JSFA调用PA(二)InternalAbility的调用方法上两篇我们学习了Ability的概念,JSFA调用Java有两种PA的方法,Ability和InternalAbility的区别,第二篇讲解了InternalAbility的调用方法。下面我们通过官方文档的案例来说明Ability调用方法的具体实现方法。在此之前,我们先了解一下相关的一些概念。相关概念在RPC(RemoteProcedureCall)Ability方法中,与FA的通信是通过RPC进行的。首先,让我们了解一下什么是RPC。RPC即RemoteProcedureCall,翻译过来就是远程过程调用。机器上的一个函数。所以它是一个比较宽泛的概念,其中我们经常使用的HTTP协议就是一种常见的RPC实现。在HarmonyOS中,很多地方都会用到RPC通信,比如跨设备调用,FA的远程拉取,FA的迁移流转等等。Intent在了解了RPC是什么之后,RPC是如何让发送方和接收方知道该做什么的呢?其实就是我们接下来要讲的对象间信息传递的载体——Intent。当开发者的PA第一次连接到FA时,会回调并返回一个IRemoteObject对象,用于后续的业务通信。开发者需要继承Ability类,重写onConnect(Intent:intent)方法,其中这个方法的参数是Intent,那么它有什么用呢?HarmonyOS提供了一种Intent机制来辅助Abilities之间的通信,例如,当一个Ability需要启动另一个Ability时,或者当一个AbilitySlice需要导航到另一个AbilitySlice时。Intent是对要执行的操作的抽象描述。在HarmonyOS中它由以下几个元素组成:通俗点说就是一个Intent作为Abilities之间通信的粘合剂。接收者的能力可以从发送者发送的意图中得到。问。JSFA调用JavaPA——能力调用方法接下来进入正题。JSFA端的这部分就不细说了,因为和InternalAbility的实现方法类似,只是action.abilityType的取值不同。更多详情,请阅读上一篇文章。//abilityType:0-能力;1-InternalAbilityconstABILITY_TYPE_EXTERNAL=0;constABILITY_TYPE_INTERNAL=1;//syncOption(Optional,defaultsync):0-Sync;1-AsyncconstACTION_SYNC=0;constACTION_ASYNC=1;constACTION_MESSAGE_CODE_PLUS=1001;exportdefault{plus:asyncfunction(){varactionData={};actionData.firstNum=1024;actionData.secondNum=2048;变种行动={};action.bundleName='com.example.hiaceservice';action.abilityName='com.example.hiaceservice.ComputeServiceAbility';action.messageCode=ACTION_MESSAGE_CODE_PLUS;action.data=actionData;action.abilityType=ABILITY_TYPE_EXTERNAL;action.syncOption=ACTION_SYNC;varresult=awaitFeatureAbility.callAbility(action);varret=JSON.parse(结果);if(ret.code==0){console.info('加上结果是:'+JSON.stringify(ret.abilityResult));}else{console.error('加上错误代码:'+JSON.stringify(ret.code));}}}PA-side(能力模式)这里还是以官方文档的案例作为参考,我们一步步分解官方案例,方便理解https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-apis-fa-calls-pa-examples-00000000006180001。导入ohos相关接口包//ohos相关接口包importohos.aafwk.ability.Ability;importohos.aafwk.content.Intent;importohos.hiviewdfx.HiLog;导入ohos.hiviewdfx.HiLogLabel;导入ohos.rpc.IRemoteBroker;导入ohos.rpc.IRemoteObject;导入ohos.rpc.RemoteObject;导入ohos.rpc.MessageParcel;导入ohos.rpc.MessageOption;导入ohos.utils.zson.ZSONObject;导入java.util.HashMap;导入java.util.Map;2。创建一个继承Ability的类,重写onConnect方法创建这个类后,首先重写onConnect(Intent:intent)方法,OnConnect返回一个远程对象,供FA向PA发送消息publicclassComputeServiceAbilityextendsAbility{//定义日志标签privatestaticfinalHiLogLabelLABEL=newHiLogLabel(HiLog.LOG_APP,0,"MY_TAG");//FA在请求PA服务时会调用Ability.connectAbility连接PA,连接成功后需要在onConnect返回一个远程对象,FA才能向PA发送消息@OverrideprotectedIRemoteObjectonConnect(Intentintent){super.onConnect(意图);返回remote.asObject();}}3.继承RemoteObject类完成重写方法业务逻辑privateMyRemoteremote=newMyRemote();类MyRemote扩展RemoteObject实现IRemoteBroker{privatestaticfinalintSUCCESS=0;私有静态最终int错误=1;私有静态最终intPLUS=1001;MyServiceRemote"MyRemote(){_super(");}@OverridepublicbooleanonRemoteRequest(intcode,MessageParceldata,MessageParcelreply,MessageOptionoption){switch(code){casePLUS:{StringdataStr=data.readString();RequestParamparam=newRequestParam();尝试{param=ZSONObject.stringToClass(dataStr,RequestParam.class);}catch(RuntimeExceptione){HiLog.error(LABEL,"convertfailed.");}//返回结果目前只支持String,对于复杂结构,可以序列化为ZSON字符串上报Mapresult=newHashMap();result.put("代码",成功);result.put("abilityResult",param.getFirstNum()+param.getSecondNum());reply.writeString(ZSONObject.toZSONString(result));休息;}默认值:{Mapresult=newHashMap();result.put("abilityError",ERROR);reply.writeString(ZSONObject.toZSONString(result));返回假;}}返回真;}@OverridepublicIRemoteObjectasObject(){返回这个;}}完整示例代码请参考官方文档https://developer。harmonyos.com/cn/docs/documentation/doc-references/js-apis-fa-calls-pa-examples-0000000000618000更多信息请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto。com