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

HarmonyOSJSFA调用JavaPA机制

时间:2023-03-11 22:32:43 科技观察

更多内容请访问:https://harmonyos.51cto.com,与华为官方共同建立的鸿蒙技术社区。实施效果1.项目介绍本项目使用模拟文件下载进度变化功能,向大家展示JSFA订阅JAVAPA的能力。订阅后,JS总能实时获取到JAVA返回的进度数据,更新JS界面的进度条。另外,文件模拟下载完成后,会跳转到计算乘积的页面。在这个页面输入两个数字,点击product按钮,展示JSFA调用JAVAPA的能力。这不像订阅,可以一直获取。java返回的数据采用调用一次,返回数据一次的方式。通过这个项目,希望大家了解以下知识点:1)FeatureAbility.callAbility(OBJECT):调用PA能力。2)FeatureAbility.subscribeAbilityEvent(OBJECT,Function):订阅PA能力。3)FeatureAbility.unsubscribeAbilityEvent(OBJECT):取消订阅PA能力。二、代码结构解读1、java/ServiceAbility:java与js的通信代码;2、java-RequestParam:请求参数的实体类;3、js-pages-index.hml:js模拟文件下载页面;4.js-pages-index.js:js订阅javapa代码;5、js-calculate-calculate.hml:js产品计算页面;6、js-calculate-calculate.js:调用javapa代码;7、config.json:js,Java配置文件,包括页面配置、服务配置、表单配置等。3、新建一个js项目,右键—新建—新建项目。选择模板——下一步。输入项目名称,选择项目类型(单选)、api版本、设备类型,点击finish。4、订阅PA的解释点击下载按钮,向java端发送订阅请求。/***请求开启订阅模式*/subscribe:asyncfunction(){this.isShow=true;//显示进度条内容varthat=this;varactionData={};actionData.firstNum=that.message;varaction={};action.bundleName='com.example.javajscommunication';//能力包名称,需与PA端匹配,区分大小写action.abilityName='com.example.javajscommunication.ServiceAbility';//能力名称,需与PA匹配匹配结束,区分大小写action.messageCode=ACTION_MESSAGE_CODE_PLUS_SUB;//Ability操作码(操作码定义了PA的业务功能,需要和PA端约定)action.data=actionData;//发送给Ability的数据,数据字段名称需要和PA端一致action.abilityType=ABILITY_TYPE_EXTERNAL;//能力类型,对应PA端action.syncOption=ACTION_SYNC的不同实现方式;//PA端请求消息处理同步/异步选项0:同步模式,默认模式。1:异步模式awaitFeatureAbility.subscribeAbilityEvent(action,function(callbackData){varcallbackJson=JSON.parse(callbackData);//json字符串反序列化that.message=callbackJson.data.abilityEvent;if(that.message==100){//当消息为100时,跳转到计算页面router.push({uri:"pages/calculate/calculate"})that.unsubscribe();//取消订阅that.isShow=false;//隐藏进度条}})}java端在ServiceAbility中处理订阅请求,根据内部类MyRemote的onRemoteRequest方法中的code参数判断请求类型进行相应处理。caseACTION_MESSAGE_CODE_PLUS_SUB:{go=true;//开启下载状态remoteObjectHandler=data.readRemoteObject();//获取请求参数对象StringzsonStr=data.readString();//获取参数字符串try{param=ZSONObject.stringToClass(zsonStr,RequestParam.class);//将字符串对象转换为RequestParam实例}catch(RuntimeExceptione){}startNotify(param);//向js端发送信息MapzsonResult=newHashMap();//返回结果,关键字段要和js方协商js端returntrue;}java端启动线程,每15毫秒以5*3的频率向js端返回数据。这里会通过在js端订阅javapa的回调函数,实时获取java发送给js的数据。/***启动线程,以每15毫秒5*3的频率向js终端返回数据。这里,java发送给js的数据,*js端会通过订阅javapa的回调函数来实时获取*/publicvoidstartNotify(RequestParamparam){number=param.getFirstNum();//获取当前progressvalueGetnewThread(fromtherequest()->{//启动线程while(go){try{Thread.sleep(5*3);//线程休眠15毫秒,继续执行MessageParceldata=MessageParcel.obtain();//创建索引为0的空MessageParcel对象MessageParcelreply=MessageParcel.obtain();zsonEvent.put("abilityEvent",number++);if(number==101){//number超过100go状态置为falsedownloadendgo=false;}data.writeString(ZSONObject.toZSONString(zsonEvent));//保存数据到MessageParcel载体remoteObjectHandler.sendRequest(100,data,reply,option);//发送reply.reclaim();//回收data.reclaim();}catch(RemoteException|InterruptedExceptione){break;}}}).start();}js页面点击取消按钮取消订阅模式,java端停止返回数据。js端代码如下:/***请求取消订阅,java端停止返回数据*/unsubscribe:asyncfunction(){varaction={};action.bundleName='com.example.javajscommunication';//能力包名,需要匹配PA端,区分大小写//能力操作代码(操作代码定义了PA的业务功能,需要和PA端约定)action.abilityType=ABILITY_TYPE_EXTERNAL;//能力类型,对应PA端不同的实现方式action.syncOption=ACTION_SYNC;//PA端请求消息处理同步/异步选项0:同步方式,默认方式。1:异步模式varresult=awaitFeatureAbility.unsubscribeAbilityEvent(action);//取消订阅varret=JSON.parse(result);//反序列化,if(ret.code==0){prompt.showToast({message:'下载是取消成功'})}else{prompt.showToast({message:'取消下载失败'})}}java端服务代码如下:caseACTION_MESSAGE_CODE_PLUS_UNSUB:{go=false;//停止方法startNotify中的while循环,停止去js端发送消息MapzsonResult=newHashMap();zsonResult.put("code",SUCCESS);reply.writeString(ZSONObject.toZSONString(zsonResult));//responsejs端returntrue;}五、调用PA解释获取输入值,在js端作为过去值传递。/***获取过去传递的第一个值*/numOne(e){this.numOne=e.value},/***获取过去传递的第二个值*/numTwo(e){this.numTwo=e.value}点击正交按钮发送呼叫模式请求。calculate:asyncfunction(){varactionData={};//键值对应PA端RequestParam类的成员字段actionData.firstNum=this.numOne;actionData.secondNum=this.numTwo;varaction={};action.bundleName='com.example.javajscommunication';//能力包名称需要匹配PA端,区分大小写action.abilityName='com.example.javajscommunication.ServiceAbility';//能力名称,需要匹配PA端,区分大小写action.messageCode=ACTION_MESSAGE_CODE_PLUS;//能力操作码(操作码定义了PA的业务功能,需要与PA端约定)action.data=actionData;//数据发送给Ability,数据字段名需要和PA端action约定。abilityType=ABILITY_TYPE_EXTERNAL;//能力类型,对应PA端不同的实现方式action.syncOption=ACTION_SYNC;//PA端请求消息处理同步/异步选项0:同步模式,默认模式。1:异步方式varresult=awaitFeatureAbility.callAbility(action);varret=JSON.parse(result);if(ret.code==0){this.message='java端返回的数据为:'+JSON。stringify(ret.abilityResult);}else{this.message='java端返回的数据报错'+JSON.stringify(ret.code);}},java端处理ServiceAbility中的订阅请求,及在内部类MyRemote的onRemoteRequest方法中,根据code参数判断请求类型,并进行相应的处理。这里,java发送给js的数据,js端会通过调用javapa的result获取到。caseACTION_MESSAGE_CODE_PLUS:{StringzsonStr=data.readString();//获取传入参数的字符串RequestParamparam=newRequestParam();try{param=ZSONObject.stringToClass(zsonStr,RequestParam.class);//将字符串对象转换为RequestParaminstance}catch(RuntimeExceptione){}//返回结果只支持可序列化的Object类型MapzsonResult=newHashMap<>();zsonResult.put("code",SUCCESS);zsonResult.put("abilityResult",param.getFirstNum()+"*"+param.getSecondNum()+"="+(param.getFirstNum()*param.getSecondNum()));reply.writeString(ZSONObject.toZSONString(zsonResult));//数据返回给js端returntrue;}返回上一个页面,这里在页面js中导入routerfrom'@system.router',然后使用router对象的相关方法返回。back(){router.back()//返回上一页}6.代码参考https://gitee.com/chinasoft6_ohos/java-js-communication更多信息请访问:与华为合作共建鸿蒙技术社区https://harmonyos.51cto.com