#2020征文-手机#浅谈JS与Java在手机APP中的混合开发方式 原创 精华
在进行鸿蒙应用开发中由于每个人的开发习惯不同,鸿蒙官方文档说明中也是支持多种开发方式,今天跟大家聊聊关于JS跟Java之间混合开发方式。
基本介绍
首先是因为我个人习惯使用JS进行页面开发布局,但是鸿蒙提供的Java API的功能比JS API的功能要强大,所以我选择用JS开发页面用Java实现逻辑交互,那么这两者之间如何进行通信就是我们需要考虑的问题。好在官方文档中有关于JS API调用Java API 机制的说明,FA提供了三个JS接口分别为:
- FeatureAbility.callAbility(OBJECT):调用PA能力;
- FeatureAbility.subscribeAbilityEvent(OBJECT, Function):订阅PA能力;
- 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中添加以下字段,还有就是需要在手机中打开定位开关
代码演示
JS端接口代码如下:其中messageCode、abilityType、syncOption值根据文档进行配置
PA端接口代码如下:
实现效果图展示如下:
点击获取位置信息展示设备经纬度,再次点击查看位置通过逆地址转换展示具体位置
这两者能够正常进行通信后,这样我们就能够在JS UI中进行页面布局,在Java UI里进行逻辑处理了,希望以上内容能对大家有所帮助。
大佬带带我
666666666
思路清晰,希望多出好文章。
真棒,兄弟,必须支持😄
会的会的,有问题可以随时交流
一起学习
写的很好,痘痘都没了
折腾。。。
最好能把源代码打个包作为附件^_^
老哥,你js+java调试时, 有没有遇到debug port busy
两个省略号 省略的是啥
包的引入与常量定义,省略这些官网例子里边都有
没有遇到呢
import ohos.aafwk.content.Intent;
import ohos.aafwk.content.Operation;
import ohos.ace.ability.AceInternalAbility;
import ohos.app.AbilityContext;
import ohos.location.GeoAddress;
import ohos.location.GeoConvert;
import ohos.rpc.IRemoteObject;
import ohos.rpc.MessageOption;
import ohos.rpc.MessageParcel;
import ohos.rpc.RemoteException;
import ohos.utils.zson.ZSONObject;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class LocationAbility extends AceInternalAbility {
private static final String TAG = LocationAbility.class.getSimpleName();
private static final String BUNDLE_NAME = "com.example.shundaschool";
private static final String ABILITY_NAME = "com.example.shundaschool.LocationAbility";
private static final int ERROR = -1;
private static final int SUCCESS = 0;
private static final int location = 666;
private static LocationAbility instance;
private AbilityContext abilityContext;
// 如果多个Ability实例都需要注册当前InternalAbility实例,需要更改构造函数,设定自己的bundleName和abilityName
public LocationAbility() {
super(BUNDLE_NAME, ABILITY_NAME);
}
.......后边的文章里都有了
java如何主动与js交互
目前还不清楚Java如何主动与js交互
RequestParamsss.class 呢 , 没有得到坐标