應(yīng)用站內(nèi)組件模塊間廣播消息 Emitter - 鴻蒙 HarmonyOS Next

應(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ì)大家有所幫助!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容