HarmonyOS API:JS LocalParticle Ability机制
版本:v3.1 Beta
概述
更新时间: 2023-02-17 09:19
方舟开发框架-基于JS扩展的类Web开发范式框架提供了JS FA(Feature Ability)调用本地Java PA(Particle Ability)的机制。该机制在HarmonyOS引擎内提供了一种通道来传递方法调用、数据返回、事件上报,开发者可根据需要自行实现FA和PA两端的对应接口完成对应的功能逻辑。
通过OS底层的跨语言消息通信机制,将JS FA的JS请求传递到Java端相应的接口上,实现JS与Java业务逻辑的通信、状态共享,使JS调用Java端方法能获得与Java调用Java方法相同的体验。
说明
从API Version 6 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
Java侧接口说明
更新时间: 2023-02-17 09:19
支持设备
API | 手机 | 平板 | 智慧屏 | 智能穿戴 |
ohos.ace.ability.LocalParticleAbility | 支持 | 支持 | 支持 | 支持 |
LocalParticleAbility类
应用包内抽象接口,实现该接口的类,其public方法通过框架直接向JS开放访问。
说明
- 同一个Ability中,特定实现类,只能注册一个实例,后注册的生效。
- 返回自定义数据结构对象时,需要实现对应属性的getter和setter方法。
- 接口参数必须是指定类型,不支持Object超类。
导入模块
import ohos.ace.ability.LocalParticleAbility;
register
void register(AceAbility aceAbility)
注册接口实例到框架层。在js侧使用该LocalParticleAbility之前需要调用register接口进行实例注册。
- 参数描述
参数名 | 类型 | 必填 | 说明 |
aceAbility | AceAbility | 是 | 该接口实例与Ability的声明周期绑定。 |
deregister
void deregister(AceAbility aceAbility)
从框架层反注册当前接口以回收资源。
- 参数描述
参数名 | 类型 | 必填 | 说明 |
aceAbility | AceAbility | 是 | 注销绑定到该Ability上的接口实例 |
Callback接口
异步回调函数接口,基于LocalParticleAbility实现的PA端,可使用该接口,异步调用JS端回调函数。
导入模块
import ohos.ace.ability.LocalParticleAbility.Callback;
reply
void reply(Object data)
PA端使用该接口向JS侧回调函数发送消息。
- 参数描述
参数名 | 类型 | 必填 | 说明 |
data | Object | 是 | 数据会直接映射到JS回调函数的参数列表。 |
说明
- data返回的是Collection/Array时,在JS侧会自动展开。如果要直接传递一个数组,JS侧函数的参数,需要声明为可变参数,如function(...data)。
JS侧接口说明
更新时间: 2023-02-17 09:19
支持设备
表1 API的设备支持情况
API | 手机 | 平板 | 智慧屏 | 智能穿戴 |
createLocalParticleAbility | 支持 | 支持 | 支持 | 支持 |
导入模块
无需导入。
createLocalParticleAbility
createLocalParticleAbility(name: string): Promise<Object>
获取Java接口实例,该Java示例对象需要调用register进行注册,否则无法获取该对象,获取到该实例后,可以调用Java侧的同名函数。
- 参数
参数名 | 类型 | 必填 | 说明 |
name | string | 是 | Java接口名称,含包路径,如com.example.test.TimeInterfaceImpl. |
- 返回值返回一个Promise对象,resolve返回结果是与PA端返回值一致的Object类型,reject回调返回结构如下,错误码类型详见表2。
参数名 | 类型 | 说明 |
code | number | 错误码 |
data | string | 错误信息 |
示例
更新时间: 2023-02-17 09:19
- LocalParticleAbility接口实现类
package com.example.apitest;
import ohos.ace.ability.LocalParticleAbility;
public class SampleJSInterface implements LocalParticleAbility {
private static final SampleJSInterface INSTANCE = new SampleJSInterface();
public static LocalParticleAbility getInstance() {
return INSTANCE;
}
public OperateData calculate(int first, int second) {
return new OperateData(first + second, first - second);
}
// 使用callback方法返回结果
public void calculateAsync(int first, int second, Callback callback) {
triggerCallback(first, second, callback);
}
private void triggerCallback(int first, int second, Callback callback) {
if (callback == null) {
return;
}
int interval = 5 + ((int) Math.floor(Math.random() * 10 + 1));
new Thread(() -> {
try {
Thread.sleep(100 * interval);
callback.reply(first + second);
Thread.sleep(100 * interval);
callback.reply(new OperateData(first, second));
Thread.sleep(100 * interval);
callback.reply("first - second = " + (first - second));
} catch (InterruptedException ignored) {
}
}).start();
}
}
- OperateData自定义返回对象
package com.example.apitest;
public class OperateData {
private int plus;
private int subtract;
public OperateData(int plus, int subtract) {
this.plus = plus;
this.subtract = subtract;
}
public int getPlus() {
return plus;
}
public void setPlus(int plus) {
this.plus = plus;
}
public int getSubtract() {
return subtract;
}
public void setSubtract(int subtract) {
this.subtract = subtract;
}
}
- MainAbility接口注册
package com.example.apitest;
import ohos.ace.ability.AceAbility;
import ohos.aafwk.content.Intent;
public class MainAbility extends AceAbility {
@Override
public void onStart(Intent intent) {
super.onStart(intent);
SampleJSInterface.getInstance().register(this);
}
@Override
public void onStop() {
super.onStop();
SampleJSInterface.getInstance().deregister(this);
}
}
- JS侧接口调用
export default {
onShow() {
// onInit生命周期中Java接口对象还未创建完成,请勿在onInit中调用。
testParticleAbility();
},
testParticleAbility() {
// 使用calculate同步方法,返回OperateData对象。
this.javaInterface = createLocalParticleAbility('com.example.apitest.SampleJSInterface');
this.javaInterface.calculate(1, 2).then(result => {
console.info('calculate result: ' + JSON.stringify(result));
}, error => {
console.error('calculate error, code: ' + error.code + ', msg = ' + error.data);
});
// 使用calculateAsync异步返回,callback返回结果。
this.javaInterface.calculateAsync(1, 2, result => {
console.info('calculate result: ' + JSON.stringify(result));
})
}
}