浅谈鸿蒙应用开发JS与Java在手机APP中的混合开发方式

开发
在进行鸿蒙应用开发中由于每个人的开发习惯不同,鸿蒙官方文档说明中也是支持多种开发方式,今天跟大家聊聊关于JS跟Java之间混合开发方式。

[[378760]]

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com/#zz

在进行鸿蒙应用开发中由于每个人的开发习惯不同,鸿蒙官方文档说明中也是支持多种开发方式,今天跟大家聊聊关于JS跟Java之间混合开发方式。

基本介绍

首先是因为我个人习惯使用JS进行页面开发布局,但是鸿蒙提供的Java API的功能比JS API的功能要强大,所以我选择用JS开发页面用Java实现逻辑交互,那么这两者之间如何进行通信就是我们需要考虑的问题。好在官方文档中有关于JS API调用Java API 机制的说明,FA提供了三个JS接口分别为:

  1. FeatureAbility.callAbility(OBJECT):调用PA能力;
  2. FeatureAbility.subscribeAbilityEvent(OBJECT, Function):订阅PA能力;
  3. FeatureAbility.unsubscribeAbilityEvent(OBJECT):取消订阅PA能力。

在PA端也有对应的接口其包含远端调用Ability和本地调用Internal Ability两种方式。

PA端调用Ability接口方式为:boolean IRemoteObject.onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option);

PA端调用Internal Ability 接口方式为:boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option)

JS端与Java通过接口扩展机制进行通信,通过bundleName和abilityName进行关联,所以我们要建立两者之间的通信,根据提供的接口字段进行相对应匹配。

接下来通过我写的例子方便大家更好的去理解JS是如何调用PA能力的。

权限配置

本示例需要位置权限,因此在config.json中添加以下字段,还有就是需要在手机中打开定位开关

  1. "reqPermissions": [  {  "name""ohos.permission.LOCATION"  }], 

代码演示

JS端接口代码如下:其中messageCode、abilityType、syncOption值根据文档进行配置

  1. aa:async function (){ 
  2.                var actionData = {}; 
  3.                actionData.longitude = this.longitude; 
  4.                actionData.latitude = this.latitude; 
  5.                 var action = {}; 
  6.                 action.data = actionData; 
  7.                 action.bundleName = 'com.example.shundaschool'
  8.                 action.abilityName = 'com.example.shundaschool.LocationAbility'
  9.                 action.messageCode = 666; 
  10.                 action.abilityType = 1; 
  11.                 action.syncOption = 1; 
  12.                 var result = await FeatureAbility.callAbility(action); 
  13.                 var ret = JSON.parse(result); 
  14.                 console.info("00000" + ret); 
  15.                 console.info("0022" + JSON.stringify(ret.abilityResult)); 
  16.                 this.$set("address",JSON.stringify(ret.abilityResult)) 
  17.     }, 

 PA端接口代码如下:

  1. ... ... 
  2.  
  3. private static final String BUNDLE_NAME = "com.example.shundaschool"
  4. private static final String ABILITY_NAME = "com.example.shundaschool.LocationAbility"
  5.  
  6. ... ... 
  7.  
  8. public LocationAbility() { 
  9.     super(BUNDLE_NAME, ABILITY_NAME); 
  10.  
  11.     public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) { 
  12.         switch (code) { 
  13.                 case location: { 
  14.                 String zsonStr = data.readString(); 
  15.                 RequestParamsss param = ZSONObject.stringToClass(zsonStr, RequestParamsss.class); 
  16.                 System.out.println("我是param经度:"+param.getLatitude()); 
  17.                 System.out.println("我是param纬度:"+param.getLongitude()); 
  18.                 // 返回结果当前仅支持String,对于复杂结构可以序列化为ZSON字符串上报 
  19.                 GeoConvert geoConvert = new GeoConvert(); 
  20.                 try{ 
  21.                     List<GeoAddress> address = geoConvert.getAddressFromLocation(param.getLatitude(), param.getLongitude(), 1); 
  22. //                    System.out.println(address); 
  23. //                    System.out.println(address.get(0).getDescriptions(0)); 
  24.                     Map<String, Object> zsonResult = new HashMap<String, Object>(); 
  25.                     zsonResult.put("code", SUCCESS); 
  26.                 System.out.println("我是param:" +  param); 
  27.                     zsonResult.put("abilityResult",  address.get(0).getDescriptions(0)); 
  28.                     if (option.getFlags() == MessageOption.TF_SYNC) { 
  29.                         reply.writeString(ZSONObject.toZSONString(zsonResult)); 
  30.                     } else { 
  31.                         // ASYNC 
  32.                         MessageParcel reponseData = MessageParcel.obtain(); 
  33.                         reponseData.writeString(ZSONObject.toZSONString(zsonResult)); 
  34.                         IRemoteObject remoteReply = reply.readRemoteObject(); 
  35.                         try { 
  36.                             remoteReply.sendRequest(0, reponseData, MessageParcel.obtain(), new MessageOption()); 
  37.                             reponseData.reclaim(); 
  38.                         } catch (RemoteException exception) { 
  39.                             return false
  40.                         } 
  41.                     } 
  42.                 }catch (IOException e){ 
  43.                     System.out.println("获取位置信息异常"); 
  44.                 } 
  45.                 break; 
  46.             } 
  47.             default:{ 
  48.                 reply.writeString("service not defined"); 
  49.                 
  50.             } 
  51.         } 
  52.         return true
  53.     }   

 实现效果图展示如下:

点击获取位置信息展示设备经纬度,再次点击查看位置通过逆地址转换展示具体位置

这两者能够正常进行通信后,这样我们就能够在JS UI中进行页面布局,在Java UI里进行逻辑处理了,希望以上内容能对大家有所帮助。

©著作权归作者和HarmonyOS技术社区共同所有,如需转载,请注明出处,否则将追究法律责任。

想了解更多内容,请访问:

51CTO和华为官方合作共建的鸿蒙技术社区

https://harmonyos.51cto.com/#zz

 

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2021-03-25 15:54:14

鸿蒙HarmonyOS应用开发

2013-03-06 09:58:39

开发方式软件开发程序员

2014-12-17 10:29:59

混合应用Hybrid App开发实战

2015-09-22 09:30:28

2009-11-23 09:27:00

PayPal支付接口

2014-03-14 14:04:29

AlloyDesign前端开发

2018-02-01 15:18:01

Android手机App

2010-12-01 09:04:59

PHP开发

2009-03-11 09:33:11

Lotus开发Workflow

2020-11-11 11:56:05

HarmonyOS

2015-07-15 09:56:07

开源框架前端开发

2009-04-24 09:14:20

.NET多线程锁机制

2022-05-16 11:17:01

应用开发JSJAVA

2023-03-07 15:08:57

2021-09-17 09:30:57

鸿蒙HarmonyOS应用

2013-09-13 13:16:05

2009-06-12 18:01:06

索尼爱立信开发者世界移动开发

2011-09-08 17:48:33

Web Widget

2022-08-09 16:01:24

应用开发鸿蒙

2021-01-18 13:17:04

鸿蒙HarmonyOSAPP
点赞
收藏

51CTO技术栈公众号