HarmonyOS API:JS LocalParticle Ability机制

joytrian
发布于 2023-4-13 19:33
浏览
0收藏

版本: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));
        })
    }
}


文章转载自:​​https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/js-apis-localparticleability-examples-0000001088980687-V3?catalogVersion=V3​

已于2023-4-13 19:33:19修改
收藏
回复
举报
回复
    相关推荐