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

HarmonyOS应用开发浅谈手机APP中JS和Java的混合开发方法

时间:2023-03-13 05:36:31 科技观察

更多内容请访问:与华为官方共建的Harmonyos技术社区https://harmonyos.51cto.com/#zz开发中鸿蒙应用,由于每个人的开发习惯不同,鸿蒙官方文档也支持多种开发方式。今天就和大家聊一聊JS和Java的混合开发方式。基本介绍首先,我习惯使用JS进行页面开发和布局,但是鸿蒙提供的JavaAPI比JSAPI更强大,所以我选择使用JS开发页面,使用Java实现逻辑交互。如何沟通是我们需要考虑的。幸运的是,官方文档中有关于JSAPI调用JavaAPI机制的描述。FA提供了三个JS接口:FeatureAbility.callAbility(OBJECT):调用PA能力;FeatureAbility.subscribeAbilityEvent(OBJECT,Function):订阅PA能力;FeatureAbility.unsubscribeAbilityEvent(OBJECT):取消订阅PA能力。PA端也有相应的接口,包括远程调用Ability和本地调用InternalAbility两种方式。PA端调用Ability接口的方式为:booleanIRemoteObject.onRemoteRequest(intcode,MessageParceldata,MessageParcelreply,MessageOptionoption);PA端调用InternalAbility接口的方式为:booleanonRemoteRequest(intcode,MessageParceldata,MessageParcelreply,MessageOptionoption)JS端通过接口扩展机制与Java通信,通过bundleName和abilityName进行关联,所以我们需要在两者之间建立通信,根据提供的接口字段进行相应的匹配。接下来通过我写的例子,方便大家更好的理解JS是如何调用PA能力的。权限配置本例需要位置权限,所以在config.json中添加如下字段,需要打开位置开关“reqPermissions”:[{“name”:“ohos.permission.LOCATION”}],代码demoJS端接口代码如下:messageCode、abilityType、syncOption值根据文档aa配置:asyncfunction(){varactionData={};actionData.longitude=this.longitude;actionData.latitude=this。latitude;varaction={};action.data=actionData;action.bundleName='com.example.shundaschool';action.abilityName='com.example.shundaschool.LocationAbility';action.messageCode=666;action.abilityType=1;action.syncOption=1;varresult=awaitFeatureAbility.callAbility(action);varret=JSON.parse(result);console.info("00000"+ret);console.info("0022"+JSON.stringify(ret.abilityResult));this.$set("address",JSON.stringify(ret.abilityResult))},PA接口代码如下:......privatestaticfinalStringBUNDLE_NAME="com.example.shundaschool";privatestaticfinalStringABILITY_NAME="com.example.shundaschool.LocationAbility";…publicLocationAbility(){super(BUNDLE_NAME,ABILITY_NAME);}publicbooleanonRemoteRequest(intcode,MessageParceldata,MessageParcelreply,MessageOptionoption){switch(code){casetlocation:{StringzsonStr=data.readString();RequestParamsssparam=ZSONObject.stringToClass(zsonStr,RequestParamsss.class)。out.println("我是param的经度:"+param.getLatitude());System.out.println("Iamthelatitudeofparam:"+param.getLongitude());//返回结果目前只支持String,对于复杂结构,可以序列化为ZSON字符串上报给GeoConvertgeoConvert=newGeoConvert();try{Listaddress=geoConvert.getAddressFromLocation(param.getLatitude(),param.getLongitude(),1);//System.out.println(address);//System.out.println(address.get(0).getDescriptions(0));MapzsonResult=newHashMap();zsonResult.put("code",SUCCESS);System.out.println("我是参数:"+param);zsonResult.put("abilityResult",address.get(0).getDescriptions(0));if(option.getFlags()==MessageOption.TF_SYNC){reply.writeString(ZSONObject.toZSONString(zsonResult));}else{//ASYNCMessageParcelreponseData=MessageParcel.obtain();reponseData.writeString(ZSONObject.toZSONString(zsonResult));IRemoteObjectremoteReply=reply.readRemoteObject();try{remoteReply.sendRequest(0),reponseData,MessageParcel.obtain(),newMessageOption());reponseData.reclaim();}catch(RemoteExceptionexception){returnfalse;}}}catch(IOExceptione){System.out.println("获取位置信息异常");}break;}default:{reply.writeString("servicenotdefined");}}returntrue;}实现效果图如下:点击获取位置信息显示设备经纬度,点击查看location通过地址逆转换再次显示具体位置。正常通信后,我们就可以在JSUI中进行页面布局,在JavaUI中进行逻辑处理。希望以上内容能够对大家有所帮助。?版权归作者及鸿蒙技术社区所有。如需转载,请注明出处,否则将追究法律责任。了解更多请访问:与华为官方共建鸿蒙科技社区https://harmonyos.51cto.com/#zz