0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

在HarmonyOS版本下如何基于JS UI框架来开发?

DRXU_gh_019562b 来源:HarmonyOS开发者 作者:zhenyu 2021-07-13 09:24 次阅读

作者:zhenyu ,华为软件开发工程师

在当前HarmonyOS版本下,如何基于JS UI框架来开发呢?

1JS UI框架下FA与PA交互的使用场景通常一个典型使用JS UI框架的HarmonyOS应用开发模型

HarmonyOS的用户应用程序包APP由一个或多个Hap包组成。每个Hap可以包含一个或多个Ability。Ability分为两种类型:Feature Ability(简称FA)和Particle Ability(简称PA),FA和PA是HarmonyOS应用的基本组成单元,能够实现特定的业务功能。

FA有UI界面,而PA无UI界面。FA有多种展现形式,如普通界面形式Page Ability,服务卡片形式Form等,一般使用JS 语言实现前台界面。PA支持ServiceAbility和Data Ability。ServiceAbility提供后台运行任务的能力,如处理复杂后台任务等。Data Ability用于对外部提供统一的数据访问抽象。这两个Ability一般使用Java 语言实现。

JS UI框架提供的声明式编程,使应用开发更加简单,但当前HarmonyOS JS API还不够丰富,无法处理数据等更复杂的业务。为了达到处理复杂业务,同时保证业务数据和UI的解耦,一般会将复杂逻辑放到PA中即JAVA端实现,而界面交互则放到FA中的UI部分即JS端实现,如图1所示。

这就涉及到FA(JS端)与PA(JAVA端)的交互,为此,Harmony OS JS UI框架提供了JS FA(Feature Ability)调用JAVA PA(Particle Ability)的机制,该机制提供了一种通道来传递方法调用、处理数据返回以及订阅事件上报。

下面我们通过一两个例子来解释该方法涉及的威廉希尔官方网站 原理。

2HarmonyOS下FA调用PA机制1接口拓展机制为支持ACE开发框架一次开发,跨平台运行的目标,采用了接口拓展机制打通前端应用层和后端平台层。JS UI框架提供了一种自动封装平台能力扩展API的机制,让应用开发者轻松调用API即能完成JS端到JAVA端的传递方法调用、处理数据返回以及订阅事件上报。

如图2所示,当前HarmonyOS支持JS作为前端应用开发语言,提供API接口,供开发者实现业务逻辑,通过类似接口拓展机制将JS层的参数传递到平台层(Native),同时在平台层提供插件代码(Plugin Native code)供三方平台实现业务逻辑。

◆ JS FrameWork

提供API用于传递方法调用,数据流通信,以及订阅事件回调。并通过JsBridge桥接起C++与JS,JsBridge主要负责加载JS代码,运行在QJS Engine上,将JS代码通过全局函数桥接到C++上,并将C++的结果返回给JS层。

◆ QJS Engine

QuickJS 是一个轻量且可嵌入的 JavaScript 引擎,包括模块、异步生成器和代理。

◆ ACE Framework

将JS的消息往平台层透传,将JS数据转换成C++类型的数据,再通过C++与JAVA的JNI接口类,将C++的数据传递到JAVA侧,并接收JAVA侧返回的数据。

◆ Native

负责平台层数据编解码,并根据解码后得到的FunctionName调用第三方开发者的插件代码逻辑。◆ HarmonyOS API平台层提供JAVA端API接口。开发者实现JAVA端对应接口的业务逻辑。2HarmonyOS下FA调用PA机制JS UI框架当前提供了Ability和Internal Ability两种FA调用PA的方式:

● Ability调用方式:拥有独立的Ability生命周期,FA使用远端进程通信拉起并请求PA服务,适用于基本服务PA有多个FA调用或者PA在后台独立运行的场景。

● Internal Ability调用方式:PA与FA共进程,PA和FA采用内部函数调用的方式进行通信,适用于对服务响应时延要求较高的场景。该方式下PA不支持其他FA访问调用。

这两种调用方式在代码中可通过abilityType来标识FA调用PA注意事项:

● JS和JAVA侧定义好的“方法调用”在对外开放后,需要保证前向兼容性。

● 序列化数据默认最大支持200KB数据量,若需要传输大数据,可以使用对应接口ohos.utils.Parcel.setCapacity()调整buffer容量大小。

3FA调用PA开发方法下面来给大家详细介绍JS FA调用JAVA PA的开发方法。

当FeatureAbility Plugin收到JS调用请求后,系统根据开发者在JS接口中设置的参数如指定的abilityType(Ability或Internal Ability),来选择对应的方式进行处理。开发者在onRemoteRequest()中实现PA提供的业务逻辑,不同的业务通过业务码来区分。

◆ FA端

1.Channel JS API提供以下模块能力:

● ModuleGroup

用于传递方法调用的类,通常用于上层应用者调用native中的某个方法而定义使用。调用callNative()方法即可将function以及对应的参数传递到平台层,需要在Native层也适配相应的逻辑代码。

简言之,即ModuleGroup实现JS调用JAVA方法,提供的JS API如下:

√ 调用PA能力,FeatureAbility.callAbility(OBJECT)

● EventGroup

用于数据流通信,通常用于平台层触发的Native事件通知应用层。在应用层调用subscribe()方法注册回调事件启动监听平台,调用unSubscribe()取消平台监听。第三方开发者在平台层需要适配相应的逻辑代码。

简言之,即EventGroup实现JAVA回调JS,提供的JS API如下:

√ 订阅PA能力,FeatureAbility.subscribeAbilityEvent(OBJECT, Function)

√ 取消订阅PA能力,FeatureAbility.unsubscribeAbilityEvent(OBJECT)

2.FeatureAbility Plugin主要完成方法调用、数据流的参数传递(编解码)、线程切换、JNI转换等处理。其主要提供以下2个重点模块:

● Internal Ability Manager

用于Internal Ability的管理,包括注册管理等,注册后的Internal Ability与FA共生命周期。

● Connection Manager

JS端与JAVA端通过接口扩展机制进行通信,通过bundleName和abilityName来进行关联。

◆ PA端

PA端提供以下两类接口:

● IRemoteObject.onRemoteRequest(int, MessageParcel, MessageParcel, MessageOption)

Ability调用方式,FA使用远端进程通信拉起并请求PA服务。

● AceInternalAbility.AceInternalAbilityHandler.onRemoteRequest(int, MessageParcel, MessageParcel, MessageOption)

Internal Ability调用方式,采用内部函数调用的方式和FA进行通信。

4Ability调用方式流程

1.FA JS端指定PA的调用方式及相关消息码和内容,调用PA(订阅PA类似)。设置bundleName,abilityName,abilityType等。2.PA JAVA端响应:通过Ability方式拉起的PA继承自Ability,FA在请求PA服务时会连接到PA,连接成功后,PA在onConnect返回一个remote对象(RemoteObject),用于FA向PA发送消息。remote对象实现onRemoteRequest方法,用于响应FA端的请求。示例代码如下:e.g.两数求和

◆ FA端 (Ability方式)

// abilityType: 0-Ability; 1-Internal Abilityconst ABILITY_TYPE_EXTERNAL = 0;const ABILITY_TYPE_INTERNAL = 1;// syncOption(Optional, default sync): 0-Sync; 1-Asyncconst ACTION_SYNC = 0;const ACTION_ASYNC = 1;const ACTION_MESSAGE_CODE_PLUS = 1001;export default { plus: async function() { var actionData = {}; actionData.firstNum = 1024; actionData.secondNum = 2048; // 请求参数,abilityName、bundleName、messageCode、abilityType、actionData需要求和的2个入参 var action = {}; action.bundleName = ‘com.example.hiaceservice’; action.abilityName = ‘com.example.hiaceservice.ComputeServiceAbility’; action.messageCode = ACTION_MESSAGE_CODE_PLUS; action.data = actionData; // 使用ability方式 action.abilityType = ABILITY_TYPE_EXTERNAL; action.syncOption = ACTION_SYNC; // FA调用PA var result = await FeatureAbility.callAbility(action); var ret = JSON.parse(result); if (ret.code == 0) { console.info(‘plus result is:’ + JSON.stringify(ret.abilityResult)); } else { console.error(‘plus error code:’ + JSON.stringify(ret.code)); } }}

◆ PA端(Ability方式)

public class ComputeServiceAbility extends Ability { private MyRemote remote = new MyRemote(); // FA在请求PA服务时会连接PA,连接成功后,需要在onConnect返回一个remote对象,供FA向PA发送消息 @Override protected IRemoteObject onConnect(Intent intent) { super.onConnect(intent); return remote.asObject(); } // remote对象的实现,完成消息请求处理,回传 class MyRemote extends RemoteObject implements IRemoteBroker { private static final int SUCCESS = 0; private static final int ERROR = 1; private static final int PLUS = 1001; MyRemote() { super(“MyService_MyRemote”); } @Override public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) { switch (code) { // 消息码PLUS case PLUS: { // 消息参数解析 String dataStr = data.readString(); RequestParam param = new RequestParam(); try { param = ZSONObject.stringToClass(dataStr, RequestParam.class); } catch (RuntimeException e) { HiLog.error(LABEL, “convert failed.”); } // 返回结果设置 Map《String, Object》 result = new HashMap《String, Object》(); result.put(“code”, SUCCESS); result.put(“abilityResult”, param.getFirstNum() + param.getSecondNum()); // 返回结果回传 reply.writeString(ZSONObject.toZSONString(result)); break; } default: { Map《String, Object》 result = new HashMap《String, Object》(); result.put(“abilityError”, ERROR); reply.writeString(ZSONObject.toZSONString(result)); return false; } } return true; } @Override public IRemoteObject asObject() { return this; } }}

5Internal Ability调用方式流程

1.FA JS端指定PA的调用方式及相关消息码和内容,调用PA(订阅PA类似)。设置bundleName,abilityName,abilityType等。2.PA JAVA端响应:通过Internal Ability方式拉起的PA需要继承自AceInternalAbility,且需要在AceAbility中注册该Internal Ability(AceAbility中执行register方法)。PA中通过setInternalAbilityHandler方法注册onRemoteRequest方法,用于响应FA端的请求。示例代码如下:e.g.两数求和

◆ FA端(Internal Ability方式)

和使用ability方式代码类似,区别是需要改变方式类型为Internal Ability:

action.abilityType = ABILITY_TYPE_INTERNAL;

◆ PA端(Internal Ability方式):

//Internal Ability注册:在MainAbility注册public class MainAbility extends AceAbility { @Override public void onStart(Intent intent) { // 注册, 如果需要在Page初始化(onInit或之前)时调用AceInternalAbility的能力,注册操作需要在super.onStart之前进行 ComputeInternalAbility.register(this); 。。。 super.onStart(intent); } @Override public void onStop() { // 注销 ComputeInternalAbility.unregister(); super.onStop(); }}

在JAVA目录下实现InternalAbility(此处为ComputeInternalAbility)

public class ComputeInternalAbility extends AceInternalAbility { private static final String BUNDLE_NAME = “com.example.hiaceservice”; private static final String ABILITY_NAME = “com.example.hiaceservice.ComputeInternalAbility”; private static final int SUCCESS = 0; private static final int ERROR = 1; private static final int PLUS = 1001; private static ComputeInternalAbility instance; private AbilityContext abilityContext; // 如果多个Ability实例都需要注册当前InternalAbility实例,需要更改构造函数,设定自己的bundleName和abilityName public ComputeInternalAbility() { super(BUNDLE_NAME, ABILITY_NAME); } public boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) { switch (code) { case PLUS: { String dataStr = data.readString(); RequestParam param = new RequestParam(); try { param = ZSONObject.stringToClass(dataStr, RequestParam.class); } catch (RuntimeException e) { HiLog.error(LABEL, “convert failed.”); } // 返回结果当前仅支持String,对于复杂结构可以序列化为ZSON字符串上报 Map《String, Object》 result = new HashMap《String, Object》(); result.put(“code”, SUCCESS); result.put(“abilityResult”, param.getFirstNum() + param.getSecondNum()); // SYNC if (option.getFlags() == MessageOption.TF_SYNC) { reply.writeString(ZSONObject.toZSONString(result)); } else { // ASYNC MessageParcel responseData = MessageParcel.obtain(); responseData.writeString(ZSONObject.toZSONString(result)); IRemoteObject remoteReply = reply.readRemoteObject(); try { remoteReply.sendRequest(0, responseData, MessageParcel.obtain(), new MessageOption()); } catch (RemoteException exception) { return false; } finally { responseData.reclaim(); } } break; } default: { Map《String, Object》 result = new HashMap《String, Object》(); result.put(“abilityError”, ERROR); reply.writeString(ZSONObject.toZSONString(result)); return false; } } return true; }

/** * Internal ability 注册接口。 */ public static void register(AbilityContext abilityContext) { instance = new ComputeInternalAbility(); instance.onRegister(abilityContext); } private void onRegister(AbilityContext abilityContext) { this.abilityContext = abilityContext; this.setInternalAbilityHandler((code, data, reply, option) -》 { return this.onRemoteRequest(code, data, reply, option); }); } /** * Internal ability 注销接口。 */ public static void unregister() { instance.onUnregister(); } private void onUnregister() { abilityContext = null; this.setInternalAbilityHandler(null); }}

以上代码样例只是关键部分,完整代码样例可参考官网资料【JS FA如何调用PA】:● JS FA如何调用PAhttps://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-js-fa-call-pa-0000001050435961

本文介绍了JS FA(Feature Ability)调用JAVA PA(Particle Ability)的机制和使用场景,基于JS UI框架开发的应用可以使用该机制完成更丰富的功能。未来HarmonyOS会持续丰富完善JS API,为开发者提供更便捷的API能力。

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • HarmonyOS
    +关注

    关注

    79

    文章

    1975

    浏览量

    30182

原文标题:JS UI框架下FA与PA是如何交互的

文章出处:【微信号:gh_019562b5fb4b,微信公众号:gh_019562b5fb4b】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)综述

    一、综述 Intents Kit(意图框架服务)是HarmonyOS级的意图标准体系 ,意图连接了应用/元服务内的业务功能。 意图框架能帮开发者将应用/元服务内的业务功能,智能分发到各
    发表于 11-28 10:43

    HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)习惯推荐方案开发者测试

    意图框架开发者提供真机测试能力,即开发者可连接设备进行调测。开发者完成代码开发之后,功能正式上架应用市场前,可以
    发表于 11-25 17:37

    HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)习惯推荐方案概述

    一、习惯推荐是HarmonyOS学习用户的行为习惯后做出的主动预测推荐。 1.开发者将用户应用/元服务内的使用行为向HarmonyOS共享,使得H
    发表于 11-19 17:59

    HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)事件推荐开发者测试

    意图框架开发者提供真机测试能力,即开发者可连接设备进行调测。开发者完成代码开发之后,功能正式上架应用市场前,可以
    发表于 11-18 17:39

    HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)本地搜索方案概述

    一、概述 本地搜索是HarmonyOS归一化搜索特性,开发者将应用/元服务内的功能和内容通过意图框架共享到HarmonyOS,即可实现“一
    发表于 11-06 10:59

    鸿蒙跨端实践-JS虚拟机架构实现

    Roma跨端方案中,JS虚拟机是框架的核心,负责执行动态化的JS代码。Android平台采用了基于V8的J2V8,iOS平台则使用了系统
    的头像 发表于 09-30 14:42 2413次阅读
    鸿蒙跨端实践-<b class='flag-5'>JS</b>虚拟机架构实现

    HarmonyOS NEXT Developer Beta1最新术语表

    。 ArkUI 方舟开发框架,是为HarmonyOS平台开发极简、高性能、跨设备应用设计研发的UI开发
    发表于 06-27 16:16

    HarmonyOS NEXT Developer Beta1中的Kit

    HarmonyOS NEXT Developer Preview1(API 11)版本开始,HarmonyOS SDK以Kit维度提供丰富、完备的开放能力,涵盖应用框架、系统、媒体、
    发表于 06-26 10:47

    鸿蒙ArkUI开发学习:【渲染控制语法】

    ArkUI开发框架是一套构建 HarmonyOS / OpenHarmony 应用界面的声明式UI开发
    的头像 发表于 04-09 16:40 1004次阅读
    鸿蒙ArkUI<b class='flag-5'>开发</b>学习:【渲染控制语法】

    鸿蒙OS开发实战:【自动化测试框架】使用指南

    为支撑HarmonyOS操作系统的自动化测试活动开展,我们提供了支持JS/TS语言的单元及UI测试框架,支持开发者针对应用接口进行单元测试,
    的头像 发表于 04-08 14:49 1397次阅读
    鸿蒙OS<b class='flag-5'>开发</b>实战:【自动化测试<b class='flag-5'>框架</b>】使用指南

    【鸿蒙】NAPI 框架生成工具实现流程

    NAPI 框架生成工具 可以根据用户指定路径的 ts(typescript)接口文件一键生成 NAPI 框架代码、业务代码框架、GN 文件等。
    的头像 发表于 02-28 17:00 694次阅读
    【鸿蒙】NAPI <b class='flag-5'>框架</b>生成工具实现流程

    HarmonyOS开发威廉希尔官方网站 全面分析

    以应用迁移为例,简要地展示了分布式任务调度能力。 图4: 分布式任务调度示意图 一次开发,多端部署 HarmonyOS 提供了用户程序框架、 Ability 框架以及
    发表于 02-21 16:31

    微软发布Agent框架UFO,引领UI交互新纪元

    微软近日宣布推出全新的Agent框架——UFO(UI-Focused Agent),旨在构建更智能、更直观的用户界面交互体验。该框架基于OpenAI的GPT-4V图像识别模型开发,专为
    的头像 发表于 02-19 11:15 1200次阅读

    HarmonyOS SDK,助力开发者打造焕然一新的鸿蒙原生应用

    UI 界面设计上,UI 组件采用去繁从简的审美风格,40 多个动效 API 帮助开发者打造富有空间感,精致细腻的视觉效果。同时,Harmony
    发表于 01-19 10:31

    鸿蒙ArkTS的起源和简介

    ,设计了新的声明式UI开发范式。 2019年,我们思考如何构建新的应用开发框架的时候,从以下几个维度进行了重点考虑: 语言生态
    发表于 01-16 16:23