在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    2005

    瀏覽量

    31773

原文標題:JS UI框架下FA與PA是如何交互的

文章出處:【微信號:gh_019562b5fb4b,微信公眾號:gh_019562b5fb4b】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    AKI跨語言調用庫神助攻C/C++代碼遷移至HarmonyOS NEXT

    ,真正做到所“鍵”即所得。 這一創新框架的出現,正是為了解決開發遷移C/C++項目到HarmonyOS NEXT時面臨的核心痛點。傳統的NAPI接口調用復雜,學習成本高,
    發表于 01-02 17:08

    HarmonyOS開發指導類文檔更新速遞()

    伴隨著HarmonyOS 5.0.0 Release、HarmonyOS 5.0.1 Release版本的發布,HarmonyOS官網文檔也帶來了不少上新內容。本期
    的頭像 發表于 12-30 09:54 ?723次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發</b>指導類文檔更新速遞(<b class='flag-5'>下</b>)

    HarmonyOS開發指導類文檔更新速遞(上)

    伴隨著HarmonyOS 5.0.0 Release版本的發布,HarmonyOS官網文檔也帶來了不少上新內容。本期HarmonyOS NEXT開發
    的頭像 發表于 12-30 09:50 ?602次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發</b>指導類文檔更新速遞(上)

    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

    AWTK 最新動態:支持鴻蒙系統(HarmonyOS Next)

    導讀HarmonyOS是全球第三大移動操作系統,有巨大的市場潛力,國產替代的背景,機會多多,AWTK支持HarmonyOS,讓AWTK開發
    的頭像 發表于 11-06 08:03 ?632次閱讀
    AWTK 最新動態:支持鴻蒙系統(<b class='flag-5'>HarmonyOS</b> Next)

    鴻蒙跨端實踐-JS虛擬機架構實現

    Roma跨端方案中,JS虛擬機是框架的核心,負責執行動態化的JS代碼。Android平臺采用了基于V8的J2V8,iOS平臺則使用了系統
    的頭像 發表于 09-30 14:42 ?2805次閱讀
    鴻蒙跨端實踐-<b class='flag-5'>JS</b>虛擬機架構實現

    學習鴻蒙必須要知道的幾個名詞

    HarmonyOS提供了一套UI(UserInterface,用戶界面)開發框架,即方舟開發框架
    的頭像 發表于 07-06 08:04 ?635次閱讀
    學習鴻蒙必須要知道的幾個名詞

    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:【從代碼到UI顯示的整體渲染流程】

    方舟開發框架(簡稱ArkUI)是鴻蒙開發UI框架,提供如下兩種開發范式,我們 **只學聲明式
    的頭像 發表于 05-13 16:06 ?1338次閱讀
    鴻蒙ArkUI:【從代碼到<b class='flag-5'>UI</b>顯示的整體渲染流程】

    HarmonyOS開發案例:【常用組件與布局】

    HarmonyOS ArkUI提供了豐富多樣的UI組件,您可以使用這些組件輕松地編寫出更加豐富、漂亮的界面。
    的頭像 發表于 05-09 18:20 ?1549次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開發</b>案例:【常用組件與布局】
    主站蜘蛛池模板: h视频免费看 | 特黄特色大片免费播放路01 | 国产女同在线观看 | 亚洲精品美女久久久久网站 | 亚洲欧洲一区二区三区在线 | 五月天婷婷综合 | 伊人狠狠丁香婷婷综合色 | 爱爱小说视频永久免费网站 | 免费一级特黄特色大片 | 黄视频网站观看 | 2021av网站 | 日韩在线视频一区 | 欧美在线性| 色婷婷在线视频观看 | 天天色综合天天 | 亚洲天堂成人在线 | 伊人小婷婷色香综合缴缴情 | 在线观看精品视频看看播放 | 天堂网www天堂在线资源链接 | aa三级动态图无遮无挡 | 激情综合色综合久久综合 | 麻豆国产三级在线观看 | 免费看黄资源大全高清 | 黄色工厂在线播放 | 国产精品漂亮美女在线观看 | 午夜黄视频 | 欧美日本不卡 | 午夜影院一级片 | 午夜免费片 | 天天综合色天天综合网 | 午夜影视啪啪免费体验区入口 | 天天综合天天色 | 亚洲人成网站色7799在线播放 | 中文字幕一区二区三区四区 | 在线观看免费高清 | yy肉戏多纯黄的小说 | 四虎永久在线精品网址 | 亚洲网站在线看 | 激情六月婷婷 | 亚洲 欧洲 日产 韩国在线 | 手机毛片 |