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

OpenHarmony 使用FA調PA能力實現JS消息訂閱功能

系統 OpenHarmony
目前JS UI框架提供的事件發布訂閱功能需要在API7版本上才能使用, 為滿足開發需求, 我們在JAVA側實現消息訂閱分發邏輯, 通過JS調JAVA能力將接口暴露給JS側, 以實現消息訂閱發布能力。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

前言

目前JS UI框架提供的事件發布訂閱功能需要在API7版本上才能使用, 為滿足開發需求, 我們在JAVA側實現消息訂閱分發邏輯, 通過JS調JAVA能力將接口暴露給JS側, 以實現消息訂閱發布能力。

效果展示

OpenHarmony 使用FA調PA能力實現JS消息訂閱功能-開源基礎軟件社區

實現思路

1、定義消息數據

一個消息事件包含事件類型, 攜帶數據, 我們先定義一個JavaBean對象表示消息數據。

class Event {
private String type;
private String data;
}

2、定義接口

消息數據模型有了, 可以開始定義接口了。

消息訂閱接口。

??key??用于表示訂閱者對象的標識. ??callback??是消息的回調接口, 我們希望訂閱者只接收到自己關心的事件, 所以還需要增加一個參數??subscribeEventTypes??表示關心的事件類型。

void subscribeEvent(key, subscribeEventTypes, callback)

取消訂閱接口。

有訂閱就會有取消, ??key??用于表示訂閱者對象的唯一標識。

void unSubscribeEvent(key)

發布消息接口。

發布消息接口, ??type??表示消息類型, ??data??表示攜帶的數據。

void publishEvent(type, data)

3、JAVA側邏輯

我們采用的是是PA調FA機制, 所以需要新建一個JAVA遠程服務Ability, 目前有??Server???和??Internal???兩種類型的服務Ability, 此處不需要考慮多進程和 生命周期問題, 所以這里使用??Internal??Ability。

(1)先創建一個類EventInternalAbility, 調用??setInternalAbilityHandler??接口實現JS側請求處理接口, 處理三種請求。

public class EventInternalAbility extends AceInternalAbility {
private final ConcurrentHashMap<String, EventObserver> observers = new ConcurrentHashMap<>(10);
private EventInternalAbility() {
setInternalAbilityHandler(this::onRemoteRequest);
}
private boolean onRemoteRequest(int code, MessageParcel data, MessageParcel reply, MessageOption option) {
switch (code) {
case SUBSCRIBE: // 處理訂閱消息請求
addObserver();
break;
case UNSUBSCRIBE: // 處理取消訂閱消息請求
removeObserver();
break;
case PUBLISH_EVENT: // 處理消息分發
publishEvent();
break;
}
return true;
}
}

(2) 處理訂閱消息請求, 我們需要在此函數下處理消息訂閱的事件類型和訂閱對象。

public class EventInternalAbility {
private void addObserver(MessageParcel data) {
JSON dataJson = new JSON(data.readString());
// 解析訂閱者的標識
String key = dataJson.get("key");
// 解析訂閱者關系的數據
List<String> subscribeEventTypes = dataJson.get("subscribeEventType");
// 添加訂閱者到map隊列中
observers.put(key, new EventObserver(subscribeEventTypes, data.readRemoteObject()));
}
}

(3) 處理取消訂閱消息請求, 此邏輯比較簡單, 將標識對應的訂閱對象移除即可。

observers.remove(key)

(4)處理消息分發請求, 我們需要在此函數下完成消息數據解析和消息分發處理。

public class EventInternalAbility {
private void publishEvent(MessageParcel data) {
// 解析數據
JSON dataJson = new JSON(data.readString());
Stirng eventType = dataJson.get("type");
Stirng eventData = dataJson.get("data");
// 分發消息
observers.forEach((key, eventObserver) -> {
if (eventObserver.getSubscribeEventType().contains(eventType)) {
eventObserver.handlenEvent(eventType, eventData);
}
});
}
}

(5)到此我們JAVA側的關鍵代碼已經完成, 我們還需要在應用啟動入口添加啟動??EventInternalAbility??服務。

public class EventInternalAbility {
private static final EventInternalAbility INSTANCE = new EventInternalAbility();
// 添加啟動服務分發
public static void startServer() {
// 我們與已經在構造函數下實現了JS側請求處理接口, 此處可為空
}
}
public class MyApplication extends AbilityPackage {
@Override
public void onInitialize() {
super.onInitialize();
// 在APP入口啟動服務
EventInternalAbility.startServer();
}
}

4. JS側邏輯

新建event-utils.js腳本文件, 實現上述定義的接口。

JS側的代碼比較簡單, 主要將入參的數據透傳給JAVA側, 邏輯比較簡單, 此處不再一一講解。

將請求bundleName abilityName等參數抽為一個方法, 以減少重復代碼。

const getParams = function (code) {
return {
messageCode: code,
// todo 此處修改為你項目的bundleName和abilityName
bundleName: 'com.chinasoftinc.event',
abilityName: 'com.chinasoftinc.event.event.EventInternalAbility',
abilityType: 1,
syncOption: 0,
data: code,
};
};

訂閱消息:

subscribeEvent(key, subscribeEventTypes, eventCallback) {
let subInfoParams = getParams(Constants.SUBSCRIBE_INFO);
subInfoParams.data = {
"key": key,
"subscribeEventTypes": subscribeEventTypes,
}
FeatureAbility.subscribeAbilityEvent(params, eventCallback)
}

取消訂閱:

unsubscribeEvent(key){
let params = getParams(Constants.UNSUBSCRIBE);
params.data = {
"key": key
}
FeatureAbility.unsubscribeAbilityEvent(params)
}

發布消息:

publishEvent(type, data){
let params = getParams(Constants.PUBLISH_EVENT);
params.data = {
"type": type,
"data": data,
}
return FeatureAbility.callAbility(params)
}

總結

OpenHarmony 使用FA調PA能力實現JS消息訂閱功能-開源基礎軟件社區

至此關鍵代碼邏輯已全部完成, 總體來說流程比較簡單, 主要使用JS UI框架提供的FA調PA能力, 將JAVA側的操作能力提供給JS側使用。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??。

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-09-10 15:13:41

鴻蒙HarmonyOS應用

2021-10-27 10:05:55

鴻蒙HarmonyOS應用

2022-03-07 14:58:10

ArkUIJS FAJava

2021-07-16 09:54:49

鴻蒙HarmonyOS應用

2021-12-20 10:07:39

鴻蒙HarmonyOS應用

2022-02-24 16:00:59

Ability鴻蒙JS

2023-04-17 16:14:55

靜態訂閱鴻蒙

2022-07-01 17:14:03

消息通知鴻蒙

2021-09-10 15:10:50

鴻蒙HarmonyOS應用

2022-05-20 10:56:54

AbilityeTS FA調用

2021-11-15 15:11:14

鴻蒙HarmonyOS應用

2022-07-26 14:40:42

ArkUIJS

2022-07-25 14:17:04

JS應用開發

2022-04-24 16:00:03

Ability鴻蒙

2024-07-29 08:34:18

C++訂閱者模式線程

2022-09-15 15:04:16

ArkUI鴻蒙

2022-09-20 14:35:59

ArkUI鴻蒙JS

2022-10-08 00:00:00

V8channel對象

2022-12-26 11:24:28

鴻蒙Stage模型

2017-03-16 08:46:57

延時消息環形隊列數據結構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久国产亚洲 | 国产精品视频yy9299一区 | 色桃网| 亚洲精品美女视频 | 久久久不卡网国产精品一区 | 在线国产一区二区 | 紧缚调教一区二区三区视频 | 欧美日韩电影免费观看 | 日韩综合在线 | 日韩美女在线看免费观看 | h视频免费观看 | 欧美中文在线 | 日韩av免费在线观看 | 亚洲午夜av久久乱码 | 国产在线激情视频 | 在线视频中文字幕 | 欧美色综合天天久久综合精品 | 免费国产黄网站在线观看视频 | 久久久久国产精品 | 天堂三级 | 国产午夜三级一区二区三 | 午夜视频一区二区三区 | 日韩高清av | 中文一区 | 精品96久久久久久中文字幕无 | 日韩中文欧美 | 国产精品综合视频 | 日韩一区av| 日韩精品视频在线 | 在线一区 | 久久精品视频在线观看 | 国产激情偷乱视频一区二区三区 | 亚洲成人www | 欧美在线观看网站 | 在线观看成人小视频 | 一区二区三区高清 | 日本中出视频 | 日韩亚洲欧美综合 | 97在线观看 | 成人伊人 | 午夜av在线 |