成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

HarmonyOS JS FA 調(diào)用 Java PA 機(jī)制

開發(fā) 后端 OpenHarmony
本項(xiàng)目使用模擬文件下載進(jìn)度變化的功能來給你展示JS FA訂閱JAVA PA的能力,訂閱之后JS可以一直實(shí)時(shí)獲取到JAVA返回的進(jìn)度數(shù)據(jù)來更新JS界面的進(jìn)度條。

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

實(shí)現(xiàn)效果

一、項(xiàng)目介紹

本項(xiàng)目使用模擬文件下載進(jìn)度變化的功能來給你展示JS FA訂閱JAVA PA的能力,訂閱之后JS可以一直實(shí)時(shí)獲取到JAVA返回的進(jìn)度數(shù)據(jù)來更新JS界面的進(jìn)度條。另外,文件模擬下載完成跳轉(zhuǎn)到一個(gè)求積的頁面,在這個(gè)頁面輸入兩個(gè)數(shù),點(diǎn)擊求積按鈕會(huì)給你展示JS FA調(diào)用JAVA PA的能力,此處并不像訂閱一樣可以一直獲取到j(luò)ava返回的數(shù)據(jù),采用的模式是調(diào)用一次返回一次數(shù)據(jù)。

通過本項(xiàng)目,是想讓你了解如下知識(shí)點(diǎn):

​ 1) FeatureAbility.callAbility(OBJECT):調(diào)用PA能力。

​ 2) FeatureAbility.subscribeAbilityEvent(OBJECT, Function):訂閱PA能力。

​ 3) FeatureAbility.unsubscribeAbilityEvent(OBJECT):取消訂閱PA能力。

二、代碼結(jié)構(gòu)解讀

HarmonyOS JS FA 調(diào)用 JAVA PA 機(jī)制-鴻蒙HarmonyOS技術(shù)社區(qū)

1、java/ServiceAbility : java與js的通信代碼;

2、java-RequestParam :請(qǐng)求參數(shù)的實(shí)體類;

3、js-pages-index.hml : js模擬文件下載頁;

4、js-pages-index.js : js訂閱java pa代碼;

5、js-calculate-calculate.hml : js求積頁面;

6、js-calculate-calculate.js : 調(diào)用java pa代碼;

7、config.json : js、java的配置文件,里面包括頁面配置、service配置、窗體配置等等。

三、新建js project

右擊—new—new project 。

HarmonyOS JS FA 調(diào)用 JAVA PA 機(jī)制-鴻蒙HarmonyOS技術(shù)社區(qū)

選擇模板—next。

HarmonyOS JS FA 調(diào)用 JAVA PA 機(jī)制-鴻蒙HarmonyOS技術(shù)社區(qū)

輸入項(xiàng)目名稱、選擇項(xiàng)目類型(單選)、api版本,設(shè)備類型,點(diǎn)擊finish即可。

HarmonyOS JS FA 調(diào)用 JAVA PA 機(jī)制-鴻蒙HarmonyOS技術(shù)社區(qū)

四、訂閱PA解讀

點(diǎn)擊下載按鈕,向java端發(fā)送訂閱請(qǐng)求。

  1. /** 
  2.  * 請(qǐng)求開啟訂閱模式 
  3.  */ 
  4. subscribe: async function() { 
  5.     this.isShow = true; // 顯示進(jìn)度條內(nèi)容 
  6.     var that = this; 
  7.  
  8.     var actionData = {}; 
  9.     actionData.firstNum = that.message; 
  10.  
  11.     var action = {}; 
  12.     action.bundleName = 'com.example.javajscommunication'; // Ability的包名稱,需要與PA端匹配,區(qū)分大小寫 
  13.     action.abilityName = 'com.example.javajscommunication.ServiceAbility'; // Ability名稱,需要與PA端匹配,區(qū)分大小寫 
  14.     action.messageCode = ACTION_MESSAGE_CODE_PLUS_SUB; // Ability操作碼(操作碼定義PA的業(yè)務(wù)功能,需要與PA端約定) 
  15.     action.data = actionData; // 發(fā)送到Ability的數(shù)據(jù),數(shù)據(jù)字段名稱需要與PA端約定 
  16.     action.abilityType = ABILITY_TYPE_EXTERNAL; // Ability類型,對(duì)應(yīng)PA端不同的實(shí)現(xiàn)方式 
  17.     action.syncOption = ACTION_SYNC; // PA側(cè)請(qǐng)求消息處理同步/異步選項(xiàng) 0:同步方式,默認(rèn)方式。 1:異步方式 
  18.  
  19.     await FeatureAbility.subscribeAbilityEvent(actionfunction (callbackData) { 
  20.         var callbackJson = JSON.parse(callbackData); // json字符串反序列化 
  21.         that.message = callbackJson.data.abilityEvent; 
  22.         if (that.message == 100) { // message 為100時(shí)進(jìn)行跳轉(zhuǎn)計(jì)算頁面 
  23.             router.push({ 
  24.                 uri: "pages/calculate/calculate" 
  25.             }) 
  26.             that.unsubscribe(); // 取消訂閱 
  27.             that.isShow = false; // 隱藏進(jìn)度條 
  28.         } 
  29.     }) 

java端在ServiceAbility中對(duì)訂閱請(qǐng)求進(jìn)行處理,在內(nèi)部類MyRemote的onRemoteRequest方法中根據(jù)code參數(shù)來判斷請(qǐng)求類型進(jìn)行相應(yīng)處理。

  1. case ACTION_MESSAGE_CODE_PLUS_SUB: { 
  2.     go = true; // 開啟可以下載狀態(tài) 
  3.     remoteObjectHandler = data.readRemoteObject(); // 獲取請(qǐng)求參數(shù)對(duì)象 
  4.     String zsonStr = data.readString(); // 獲取參數(shù)字符串 
  5.  
  6.     try { 
  7.         param = ZSONObject.stringToClass(zsonStr, RequestParam.class); // 字符串對(duì)象轉(zhuǎn)成RequestParam實(shí)例 
  8.     } catch (RuntimeException e) { 
  9.  
  10.     } 
  11.     startNotify(param); // 給js端發(fā)送信息 
  12.  
  13.     Map<String, Object> zsonResult = new HashMap<String, Object>();// 返回結(jié)果,關(guān)鍵字段應(yīng)與Js方協(xié)商 
  14.     zsonResult.put("code", SUCCESS); 
  15.     reply.writeString(ZSONObject.toZSONString(zsonResult)); // map 對(duì)象轉(zhuǎn)成json字符串,并返回給js端 
  16.     return true

 java端開啟線程,按照5*3 每15毫秒的頻率返回?cái)?shù)據(jù)給js端。這里java發(fā)送給js的數(shù)據(jù),js端會(huì)通過訂閱java pa的回調(diào)函數(shù)中而實(shí)時(shí)獲取到。

  1. /** 
  2.  *  開啟線程,按照5*3 每15毫秒的頻率返回?cái)?shù)據(jù)給js端。這里java發(fā)送給js的數(shù)據(jù), 
  3.  *  js端會(huì)通過訂閱java pa的回調(diào)函數(shù)中而實(shí)時(shí)獲取到 
  4.  */ 
  5. public void startNotify(RequestParam param) { 
  6.     number = param.getFirstNum(); // 獲取當(dāng)前進(jìn)度值從請(qǐng)求中獲取 
  7.     new Thread(() -> { // 開啟線程 
  8.         while (go) { 
  9.             try { 
  10.                 Thread.sleep(5 * 3); // 線程睡眠15毫秒后繼續(xù)往下執(zhí)行 
  11.                 MessageParcel data = MessageParcel.obtain(); // 創(chuàng)建索引為0的空MessageParcel對(duì)象 
  12.                 MessageParcel reply = MessageParcel.obtain(); 
  13.                 zsonEvent.put("abilityEvent", number++); 
  14.                 if (number == 101) { // number超過100 go狀態(tài)設(shè)為false 下載結(jié)束 
  15.                     go = false
  16.                 } 
  17.                 data.writeString(ZSONObject.toZSONString(zsonEvent)); // 數(shù)據(jù)存到MessageParcel載體 
  18.                 remoteObjectHandler.sendRequest(100, data, reply, option); // 發(fā)送 
  19.                 reply.reclaim(); // 回收 
  20.                 data.reclaim(); 
  21.             } catch (RemoteException | InterruptedException e) { 
  22.                 break; 
  23.             } 
  24.         } 
  25.     }).start(); 

js頁面點(diǎn)擊取消按鈕,取消訂閱模式, java端停止返回?cái)?shù)據(jù)。

js端代碼如下:

  1. /** 
  2.  * 請(qǐng)求取消訂閱, java端停止返回?cái)?shù)據(jù) 
  3.  */ 
  4. unsubscribe: async function() { 
  5.     var action = {}; 
  6.     action.bundleName = 'com.example.javajscommunication'; // Ability的包名稱,需要與PA端匹配,區(qū)分大小寫 
  7.     action.abilityName = 'com.example.javajscommunication.ServiceAbility'; // Ability名稱,需要與PA端匹配,區(qū)分大小寫 
  8.     action.messageCode = ACTION_MESSAGE_CODE_PLUS_UNSUB; // Ability操作碼(操作碼定義PA的業(yè)務(wù)功能,需要與PA端約定) 
  9.     action.abilityType = ABILITY_TYPE_EXTERNAL; // Ability類型,對(duì)應(yīng)PA端不同的實(shí)現(xiàn)方式 
  10.     action.syncOption = ACTION_SYNC;  // PA側(cè)請(qǐng)求消息處理同步/異步選項(xiàng) 0:同步方式,默認(rèn)方式。 1:異步方式 
  11.  
  12.     var result = await FeatureAbility.unsubscribeAbilityEvent(action); // 取消訂閱 
  13.     var ret = JSON.parse(result); // 反序列化, 
  14.     if (ret.code == 0) { 
  15.         prompt.showToast({ 
  16.             message: '取消下載成功' 
  17.         }) 
  18.     } else { 
  19.         prompt.showToast({ 
  20.             message: '取消下載失敗' 
  21.         }) 
  22.     } 

 java端service代碼如下:

  1. case ACTION_MESSAGE_CODE_PLUS_UNSUB: { 
  2.     go = false; // 停止方法startNotify中的while循環(huán),停止往js端發(fā)送消息 
  3.     Map<String, Object> zsonResult = new HashMap<String, Object>(); 
  4.     zsonResult.put("code", SUCCESS); 
  5.     reply.writeString(ZSONObject.toZSONString(zsonResult)); // 響應(yīng)js端 
  6.     return true

五、調(diào)用PA解讀

獲取input輸入的值,作為js端傳遞過去的值。

  1. /**  
  2.   * 取傳過去的第一個(gè)值  
  3.   */ 
  4.     numOne (e){ 
  5.         this.numOne = e.value 
  6.     },   
  7.  /**  
  8.   * 獲取傳過去的第二個(gè)值 
  9.   */ 
  10.     numTwo (e){ 
  11.         this.numTwo = e.value 
  12.     } 

 點(diǎn)擊求積按鈕 發(fā)送調(diào)用模式的請(qǐng)求。

  1. calculate: async function() { 
  2.     var actionData = {}; // key值對(duì)應(yīng)PA端的RequestParam類的成員字段 
  3.     actionData.firstNum = this.numOne; 
  4.     actionData.secondNum = this.numTwo; 
  5.  
  6.     var action = {}; 
  7.     action.bundleName = 'com.example.javajscommunication'; // Ability的包名稱,需要與PA端匹配,區(qū)分大小寫 
  8.     action.abilityName = 'com.example.javajscommunication.ServiceAbility'; // Ability名稱,需要與PA端匹配,區(qū)分大小寫 
  9.     action.messageCode = ACTION_MESSAGE_CODE_PLUS; // Ability操作碼(操作碼定義PA的業(yè)務(wù)功能,需要與PA端約定) 
  10.     action.data = actionData; // 發(fā)送到Ability的數(shù)據(jù),數(shù)據(jù)字段名稱需要與PA端約定 
  11.     action.abilityType = ABILITY_TYPE_EXTERNAL; // Ability類型,對(duì)應(yīng)PA端不同的實(shí)現(xiàn)方式 
  12.     action.syncOption = ACTION_SYNC;  // PA側(cè)請(qǐng)求消息處理同步/異步選項(xiàng) 0:同步方式,默認(rèn)方式。 1:異步方式 
  13.  
  14.     var result = await FeatureAbility.callAbility(action); 
  15.     var ret = JSON.parse(result); 
  16.     if (ret.code == 0) { 
  17.         this.message =  'java端傳回的數(shù)據(jù)為:' + JSON.stringify(ret.abilityResult); 
  18.     } else { 
  19.         this.message =  'java端傳回的數(shù)據(jù)報(bào)錯(cuò)' + JSON.stringify(ret.code); 
  20.     } 
  21. }, 

java端在ServiceAbility中對(duì)訂閱請(qǐng)求進(jìn)行處理,在內(nèi)部類MyRemote的onRemoteRequest方法中根據(jù)code參數(shù)來判斷請(qǐng)求類型進(jìn)行相應(yīng)處理。這里java發(fā)送給js的數(shù)據(jù),js端會(huì)通過調(diào)用java pa的結(jié)果而獲取到。

  1. case ACTION_MESSAGE_CODE_PLUS: { 
  2.     String zsonStr = data.readString(); // 獲取傳入?yún)?shù)的字符串 
  3.     RequestParam param = new RequestParam(); 
  4.     try { 
  5.         param = ZSONObject.stringToClass(zsonStr, RequestParam.class); // 字符串對(duì)象轉(zhuǎn)成RequestParam實(shí)例 
  6.     } catch (RuntimeException e) { 
  7.  
  8.     } 
  9.  
  10.     // 返回結(jié)果僅支持可序列化的Object類型 
  11.     Map<String, Object> zsonResult = new HashMap<>(); 
  12.     zsonResult.put("code", SUCCESS); 
  13.     zsonResult.put("abilityResult", param.getFirstNum() + " * " + param.getSecondNum() + " = " + (param.getFirstNum() * param.getSecondNum())); 
  14.     reply.writeString(ZSONObject.toZSONString(zsonResult)); // 數(shù)據(jù)返回給js端 
  15.     return true

 返回到前一個(gè)頁面,這里在頁面js中import router from ‘@system.router’,然后利用router對(duì)象的相關(guān)方法返回。

  1. back(){ 
  2.     router.back() // 返回到前一個(gè)頁面 

六、代碼參考

https://gitee.com/chinasoft6_ohos/java-js-communication

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-10-27 10:05:55

鴻蒙HarmonyOS應(yīng)用

2022-03-07 14:58:10

ArkUIJS FAJava

2021-12-20 10:07:39

鴻蒙HarmonyOS應(yīng)用

2022-06-02 14:27:05

UI框架JS

2021-07-16 09:54:49

鴻蒙HarmonyOS應(yīng)用

2022-02-24 16:00:59

Ability鴻蒙JS

2021-11-15 15:11:14

鴻蒙HarmonyOS應(yīng)用

2022-02-17 21:28:08

AbilityJSFA鴻蒙

2022-02-17 21:19:35

JSFA操作系統(tǒng)鴻蒙

2022-09-08 15:18:51

Ability鴻蒙

2015-03-26 13:14:53

javascriptjs callback實(shí)現(xiàn)調(diào)用

2022-05-20 10:56:54

AbilityeTS FA調(diào)用

2021-03-02 09:29:29

鴻蒙HarmonyOS應(yīng)用開發(fā)

2017-05-02 22:38:44

前端開發(fā)JS事件循環(huán)機(jī)制

2022-05-24 15:06:57

AbilityeTS FA鴻蒙

2022-02-17 21:05:26

AbilityJS FAJava PA

2015-11-20 11:20:54

js開發(fā)

2023-10-17 09:26:44

Java工具

2021-05-07 09:35:30

鴻蒙HarmonyOS應(yīng)用

2020-11-08 14:32:01

JavaScript變量內(nèi)存管理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 中文字幕在线观看一区 | 欧美 视频 | 久草热线 | 国产1页 | 成人精品国产 | 九九亚洲 | 国产色爽 | av播播| 日本a网站| 337p日本欧洲亚洲大胆鲁鲁 | 二区久久 | 国产精品精品视频一区二区三区 | 日韩精品一区二区三区视频播放 | 精品国产一区久久 | 在线免费亚洲视频 | 日韩波多野结衣 | 免费观看成人鲁鲁鲁鲁鲁视频 | 日韩乱码在线 | www.欧美.com| 精品99在线| 午夜不卡一区二区 | 亚洲午夜视频 | 三级黄色片在线播放 | 日韩在线视频一区 | 成人免费在线小视频 | 国产毛片毛片 | 日韩欧美在线观看 | 日韩欧美在线视频播放 | 色综合久久久 | 日本人做爰大片免费观看一老师 | 91亚洲国产成人久久精品网站 | 美女中文字幕视频 | av久久 | 一区二区三区免费看 | 日韩欧美一区二区三区在线播放 | 成人影院在线观看 | 亚洲一区网站 | 亚洲在线日韩 | 黄色一级电影免费观看 | 日韩欧美一区二区三区免费看 | 国产精品精品视频一区二区三区 |