應(yīng)用站內(nèi)組件模塊間廣播消息,適用于站內(nèi)各模塊間信息的傳遞與分發(fā),例如某個(gè)公共狀態(tài)屬性的變更同步響應(yīng)至各個(gè)所需之處;
類似于 iOS 中的通知 NSNotificationCenter 或者 Android 的 EventBus,通過某個(gè) click 事件向其它已預(yù)訂閱的模塊發(fā)送廣播消息;
注:以下內(nèi)容基于 HarmonyOS NEXT Developer Beta3 版本實(shí)現(xiàn)
若主線程內(nèi)通信可以通過 EventHub
若主線程與 Worker 間通信可以通過 Emitter
若應(yīng)用間的通信可以通過 commonEventManager
具體可根據(jù)實(shí)際業(yè)務(wù)而定,起初先嘗試使用的 commonEventManager 后切換成了 Emitter 更適合作用域于應(yīng)用站內(nèi)的模式,具體實(shí)現(xiàn)如下:

基于 BasicServicesKit api 中的接口方法實(shí)現(xiàn)廣播消息的訂閱、發(fā)送和解除訂閱;
首先,廣播消息的訂閱
// 訂閱: 事件監(jiān)聽_持續(xù)
// EmitterCenter.shareInstance().on(EmitterKey.Emitter_ReloadWeb, (data) => {
// console.info('[EmitterCenter] - callback:', JSON.stringify(data.data))
// })
on(key: string, callback:(eventData: emitter.EventData) => void) {
console.log('[EmitterCenter] - on:', key)
emitter.on(key, callback)
}
其次,廣播消息的發(fā)送
EventPriority 分發(fā)類型
IMMEDIATE: 0 事件被立即投遞
HIGH: 1 事件先于LOW優(yōu)先級(jí)投遞
LOW: 2 事件優(yōu)于IDLE優(yōu)先級(jí)投遞,事件的默認(rèn)優(yōu)先級(jí)是LOW
IDLE: 3 在沒有其他事件的情況下投遞該事件
// 訂閱: 事件發(fā)送
// EmitterCenter.shareInstance().post(EmitterKey.Emitter_ReloadWeb, new Object({
// 'key': item.value,
// }))
post(key: string, data?:object) {
console.log('[EmitterCenter] - post:', key)
let option: emitter.Options = {
priority: emitter.EventPriority.IMMEDIATE // 事件立即發(fā)送
}
let eventData: emitter.EventData = { // 數(shù)據(jù)源
data: data // [key: string]: any
}
emitter.emit(key, option, eventData)
}
最后,廣播消息的解除訂閱
// 訂閱: 事件解綁
// EmitterCenter.shareInstance().off(EmitterKey.Emitter_ReloadWeb)
off(key: string) {
console.log('[EmitterCenter] - off:', key)
emitter.off(key)
}
完整事例如下,通過自定義廣播消息類,針對(duì)消息的收、發(fā)和解進(jìn)行簡(jiǎn)易封裝后按需調(diào)用即可:
import { emitter } from '@kit.BasicServicesKit';
// 通信協(xié)議
export enum EmitterKey {
// 監(jiān)聽網(wǎng)絡(luò)狀態(tài)
Emitter_NoticeNetworkState = 'NoticeNetworkState',
// 獲取藍(lán)牙狀態(tài)
Emitter_BluetoothState = 'NoticeBluetoothState',
// 刷新 web
Emitter_ReloadWeb = 'reloadWebView',
// 監(jiān)測(cè)鍵盤彈出 & 收起狀態(tài)
Emitter_KeyboardChangeState = 'NoticeKeyboardChangeState',
// 應(yīng)用即將進(jìn)入前臺(tái)
Emitter_MsgAppWillStarting = 'MsgAppWillStarting',
// 應(yīng)用進(jìn)入前臺(tái)
Emitter_MsgAppStarting = 'MsgAppStarting',
// 應(yīng)用進(jìn)入后臺(tái)
Emitter_MsgAppReactivate = 'MsgAppReactivate',
}
export default class EmitterCenter {
private static instance: EmitterCenter
private constructor() {
}
static shareInstance(): EmitterCenter {
if (!EmitterCenter.instance) {
EmitterCenter.instance = new EmitterCenter()
}
return EmitterCenter.instance
}
// 訂閱: 事件監(jiān)聽_持續(xù)
// EmitterCenter.shareInstance().on(EmitterKey.Emitter_ReloadWeb, (data) => {
// console.info('[EmitterCenter] - callback:', JSON.stringify(data.data))
// })
on(key: string, callback:(eventData: emitter.EventData) => void) {
console.log('[EmitterCenter] - on:', key)
emitter.on(key, callback)
}
// 訂閱: 事件解綁
// EmitterCenter.shareInstance().off(EmitterKey.Emitter_ReloadWeb)
off(key: string) {
console.log('[EmitterCenter] - off:', key)
emitter.off(key)
}
// 訂閱: 事件發(fā)送
// EmitterCenter.shareInstance().post(EmitterKey.Emitter_ReloadWeb, new Object({
// 'key': item.value,
// }))
post(key: string, data?:object) {
console.log('[EmitterCenter] - post:', key)
let option: emitter.Options = {
priority: emitter.EventPriority.IMMEDIATE // 事件立即發(fā)送
}
let eventData: emitter.EventData = { // 數(shù)據(jù)源
data: data // [key: string]: any
}
emitter.emit(key, option, eventData)
}
}
以上便是此次分享的全部?jī)?nèi)容,希望能對(duì)大家有所幫助!