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

OpenHarmony 使用FA調(diào)PA能力實現(xiàn)JS消息訂閱功能

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

??想了解更多關(guān)于開源的內(nèi)容,請訪問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

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

前言

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

效果展示

OpenHarmony 使用FA調(diào)PA能力實現(xiàn)JS消息訂閱功能-開源基礎(chǔ)軟件社區(qū)

實現(xiàn)思路

1、定義消息數(shù)據(jù)

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

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

2、定義接口

消息數(shù)據(jù)模型有了, 可以開始定義接口了。

消息訂閱接口。

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

void subscribeEvent(key, subscribeEventTypes, callback)

取消訂閱接口。

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

void unSubscribeEvent(key)

發(fā)布消息接口。

發(fā)布消息接口, ??type??表示消息類型, ??data??表示攜帶的數(shù)據(jù)。

void publishEvent(type, data)

3、JAVA側(cè)邏輯

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

(1)先創(chuàng)建一個類EventInternalAbility, 調(diào)用??setInternalAbilityHandler??接口實現(xiàn)JS側(cè)請求處理接口, 處理三種請求。

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: // 處理消息分發(fā)
publishEvent();
break;
}
return true;
}
}

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

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

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

observers.remove(key)

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

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

(5)到此我們JAVA側(cè)的關(guān)鍵代碼已經(jīng)完成, 我們還需要在應(yīng)用啟動入口添加啟動??EventInternalAbility??服務(wù)。

public class EventInternalAbility {
private static final EventInternalAbility INSTANCE = new EventInternalAbility();
// 添加啟動服務(wù)分發(fā)
public static void startServer() {
// 我們與已經(jīng)在構(gòu)造函數(shù)下實現(xiàn)了JS側(cè)請求處理接口, 此處可為空
}
}
public class MyApplication extends AbilityPackage {
@Override
public void onInitialize() {
super.onInitialize();
// 在APP入口啟動服務(wù)
EventInternalAbility.startServer();
}
}

4. JS側(cè)邏輯

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

JS側(cè)的代碼比較簡單, 主要將入?yún)⒌臄?shù)據(jù)透傳給JAVA側(cè), 邏輯比較簡單, 此處不再一一講解。

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

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)
}

發(fā)布消息:

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

總結(jié)

OpenHarmony 使用FA調(diào)PA能力實現(xiàn)JS消息訂閱功能-開源基礎(chǔ)軟件社區(qū)

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

??想了解更多關(guān)于開源的內(nèi)容,請訪問:??

??51CTO 開源基礎(chǔ)軟件社區(qū)??

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

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

2021-09-10 15:13:41

鴻蒙HarmonyOS應(yīng)用

2021-10-27 10:05:55

鴻蒙HarmonyOS應(yīng)用

2022-03-07 14:58:10

ArkUIJS FAJava

2021-07-16 09:54:49

鴻蒙HarmonyOS應(yīng)用

2021-12-20 10:07:39

鴻蒙HarmonyOS應(yīng)用

2022-02-24 16:00:59

Ability鴻蒙JS

2023-04-17 16:14:55

靜態(tài)訂閱鴻蒙

2022-05-20 10:56:54

AbilityeTS FA調(diào)用

2021-09-10 15:10:50

鴻蒙HarmonyOS應(yīng)用

2022-07-01 17:14:03

消息通知鴻蒙

2022-04-24 16:00:03

Ability鴻蒙

2021-11-15 15:11:14

鴻蒙HarmonyOS應(yīng)用

2022-07-26 14:40:42

ArkUIJS

2022-07-25 14:17:04

JS應(yīng)用開發(fā)

2022-12-26 11:24:28

鴻蒙Stage模型

2022-09-15 15:04:16

ArkUI鴻蒙

2022-09-20 14:35:59

ArkUI鴻蒙JS

2023-08-08 14:31:42

輪播圖鴻蒙

2024-07-29 08:34:18

C++訂閱者模式線程

2022-10-08 00:00:00

V8channel對象
點贊
收藏

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

主站蜘蛛池模板: 欧美精品久久久 | 日本黄色片免费在线观看 | 欧美黑人一级爽快片淫片高清 | 国产一区二区三区四区五区加勒比 | 日本免费一区二区三区 | 日本黄色大片免费 | 久久精品国产免费 | 色在线视频网站 | 在线欧美视频 | 99视频在线播放 | 伊人伊人| 国产精品一区三区 | 国产精品久久99 | 欧美一级大黄 | 亚洲一区毛片 | 久草在线高清 | 欧洲成人 | 精品国产欧美在线 | 久久久www | 天堂网中文字幕在线观看 | 一区二区三区国产好的精 | www.久| 久久久久久久久久影视 | 我我色综合 | 国产成人精品a视频一区www | 日韩在线小视频 | 91久久精品国产91久久性色tv | 天天干天天干 | aaaa一级毛片 | 欧美激情在线播放 | 天天操夜夜爽 | 日本a级大片| 亚洲高清在线观看 | 国产精品视频一区二区三区不卡 | 亚洲一区二区三区在线播放 | 亚洲精品久久久一区二区三区 | 欧美精品久久久 | 中文字幕1区| 全免费a级毛片免费看视频免费下 | 久久久久久亚洲精品 | 国产真实精品久久二三区 |