HarmonyOS 公共事件機制介紹以及多進程之間的通信實現(9000字詳解)

HarmonyOS 公共事件機制介紹以及多進程之間的通信

CES(Common Event Service,公共事件服務)為應用程序提供訂閱、發布、退訂公共事件的能力

1. 公共事件的介紹

1.1.1公共事件的分類:公共事件從系統的角度可以分為系統公共事件和自定義公共事件

  • 系統公共事件:CES內部定義的公共事件,當前僅支持系統應用和系統服務發布,例如HAP安裝、更新、卸載等公共事件。目前支持的系統公共事件請參考系統公共事件列表

  • 自定義的公共事件:應用定義的公共事件,可用于實現跨進程的事件通信能力(重點:可以死實現跨進程通信)

1.1.2 公共事件的發送方式

  • 無序公共事件:CES在轉發公共事件時,不考慮訂閱者是否接收到該事件,也不保證訂閱者接收到該事件的順序與其訂閱順序一致。打個比方就好像群發短信,廣播式發送,一次性發給所有訂閱者,不保證順序,誰先收到看運氣,不保證送達,可能都有接收失敗的情況。比如老師給全班群發短信,同學A手機信號好,收到信息的時間是13:05,而B同學的手機比較卡頓,收到信息的時間為13:07。

    • 代碼示例

      // 發布無序事件
      CommonEventData event = new CommonEventData("MSG_UPDATE");
      CommonEventManager.publishCommonEvent(event);
    • 適用場景

      • 非關鍵性的通知(如:APP內容更新提醒)
      • 不需要反饋的廣播(如定時任務的觸發)
  • 有序公共事件:CES在轉發公共事件時,根據訂閱者設置的優先級等級,優先將公共事件發送給優先級較高的訂閱者,等待其成功接收該公共事件之后再將事件發送給優先級較低的訂閱者。如果有多個訂閱者具有相同的優先級,則他們將隨機接收到公共事件。打個比方就好像銀行的呼叫系統,嚴格按照優先級,高優先級先處理,前一個處理完才傳下一個,鏈式傳遞,任一環節可終止傳遞,就好比商場的vip服務,鉆石客戶優先辦理。

    • 代碼示例

      // 訂閱時設置優先級
      CommonEventSubscribeInfo info = new CommonEventSubscribeInfo();
      info.setPriority(9); // 最高優先級CommonEventSubscriber subscriber = new CommonEventSubscriber(info) {@Overridepublic void onReceiveEvent(CommonEventData event) {// 處理完成后必須調用此方法才會傳遞給下一級!finishCommonEvent();}
      };
    • 適用場景

      • 需要審核流程的操作(比如付款確認鏈)
      • 敏感操作驗證(多層安全校驗)
  • 粘性公共事件:能夠讓訂閱者收到在訂閱前已經發送的公共事件就是粘性公共事件。普通的公共事件只能在訂閱后發送才能收到,而粘性公共事件的特殊性就是可以先發送后訂閱,同時也支持先訂閱后發送。發送粘性事件必須是系統應用或系統服務,粘性事件發送后會一直存在系統中,且發送者需要申請ohos.permission.COMMONEVENT_STICKY權限,配置方式請參見聲明權限。打個比方來說就像小區公告欄貼出的停水通知,居民A當天看到,就可以馬上儲水,居民B三天后搬來,看到歷史通知,只有物業(系統應用)有權粘貼

    • 代碼
    // 發布粘性事件(需系統權限)
    const commonEvent = {name: "CONNECTIVITY_CHANGE", // 網絡狀態變更事件sticky: true,                // 設為粘性事件data: { connected: false }
    };
    commonEventManager.publishAsStickyCommonEvent(commonEvent);// 新用戶安裝APP后訂閱
    commonEventManager.subscribe({name: "CONNECTIVITY_CHANGE"
    }, (err, data) => {console.log("當前網絡狀態:" + data.connected);// 新訂閱者立即收到最后一次網絡狀態!
    });
    • 適用場景
      • 系統狀態通知(比如電池電量、網絡連接)
      • 全局配置變更(比如深色模式切換)

1.2.3 關鍵對比

特性無序事件有序事件粘性事件
接收順序隨機按優先級按訂閱順序
事件存續瞬態瞬態持久化存儲
是否可中斷? 可中斷鏈
發布權限所有應用所有應用僅系統應用
后訂閱收歷史事件? 能接收到
典型用例通知推送流程審批系統狀態同步

1.2.4 為什么黏性事件需要特殊權限

  1. 安全分險

    • 粘性事件長期駐留內存
    • 可能包含敏感信息(如網絡狀態)
  2. 資源消耗

    ```mermaid
    graph LRA[持久化存儲] --> B[內存占用]A --> C[磁盤空間]
    
  3. 權限申請: 在module.json5中添加:

"requestPermissions": [{"name": "ohos.permission.COMMONEVENT_STICKY"}
]

2. 公共事件的運作機制

每個應用都可以按需訂閱公共事件,訂閱成功,當公共事件發布時,系統會將其發送給對應的應用。這些公共事件可能來自系統,其他應用和應用自身

0000000000011111111.20250626230610.51544755015630871068185963599735:50001231000000:2800:9832742DB4896A0423AB8336F129BD83E024A890FD6D41D6F8B81DBC74781A13.png

2.1 安全注意事項

  • 公共事件發布方

    :如果不加限制,任何應用都可以訂閱公共事件并讀取相關信息,應避免在公共事件中攜帶敏感信息。采用以下方式,可以限制公共事件接收方的范圍。

    • 通過CommonEventPublishData中的subscriberPermissions參數指定訂閱者所需權限。
    • 通過CommonEventPublishData中的bundleName參數指定訂閱者的包名。
  • 公共事件訂閱方

    :訂閱自定義公共事件后,任意應用都可以向訂閱者發送潛在的惡意公共事件。采用以下方式,可以限制公共事件發布方的范圍。

    • 通過CommonEventSubscribeInfo中的publisherPermission參數指定發布者所需權限。
    • 通過CommonEventSubscribeInfo中的publisherBundleName參數參數指定發布者的包名。
  • 自定義公共事件名稱應確保全局唯一,否則可能與其他公共事件沖突。

3. 動態訂閱公共事件

3.1 場景介紹

動態訂閱是指當應用在運行狀態時對某個公共事件進行訂閱,在運行期間如果有訂閱的事件發布那么訂閱了這個事件的應用將會收到改事件及其傳遞的參數

例如,某應用希望在運行期間收到電量過低的事件,并根據該事件降低其運行功耗,那么該應用便可動態訂閱電量過低事件,收到該事件關閉一些非必要的任務來降低功耗

  • 定義:應用程序在運行時訂閱特定公共事件的機制
  • 特點:僅在應用處于前臺運行狀態時有效(后臺不接受事件)
  • 生命周期:從訂閱開始到應用進程結束/主動退訂

3.2 工作流程圖展示

在這里插入圖片描述

3.3 完整開發流程概覽

在這里插入圖片描述

4. 公共事件的發布和訂閱的使用步驟

4.1.1 公共事件的發布

當需要發布某個自定義公共事件時,可以通過publish()方法發布事件。發布的公共事件可以攜帶數據,供訂閱者解析并進行下一步處理。

image-20250629205241360

image-20250629205117622

1. 簡單事件發布(無數據)
// 導入必要模塊
import { commonEventManager } from '@kit.BasicServicesKit';// 發布"任務完成"通知
commonEventManager.publish('TASK_COMPLETED', (err) => {if (err) {console.error('發布失敗', err)} else {console.log('任務完成通知已發送')}
});
2. 傳遞數據的事件發布(帶溫度信息)
import { commonEventManager } from '@kit.BasicServicesKit';// 準備事件數據
const eventData = {code: 200,  // 溫度事件代碼data: "23.5°C", isSticky: true // 新訂閱者也應知道當前溫度
};// 發布帶溫度的天氣事件
commonEventManager.publish('TEMPERATURE_UPDATE', eventData, (err) => {if (err) {console.error('溫度發布失敗', err)} else {console.log('當前溫度已更新')}
});

4.1.2 公共事件的訂閱

場景介紹

動態訂閱是指當應用在運行狀態時對某個公共事件進行訂閱,在運行期間如果有訂閱的事件發布那么訂閱了這個事件的應用將會收到該事件及其傳遞的參數。

例如,某應用希望在其運行期間收到電量過低的事件,并根據該事件降低其運行功耗,那么該應用便可動態訂閱電量過低事件,收到該事件后關閉一些非必要的任務來降低功耗。

訂閱部分系統公共事件需要先申請權限,訂閱這些事件所需要的權限請見公共事件權限列表

image-20250629215200255

從鴻蒙系統服務模塊導入commonEventManager,這是鴻蒙提供的事件管理工具,類似于瀏覽器的EventBus或Node.js的EventEmitter


class SubscribeClass {subscriber?: commonEventManager.CommonEventSubscriber
使用步驟

1.創建事件訂閱類

  1. 定義SubscribeClass類作為一個事件中心
  2. 聲明subscriber屬性 - 用來存儲訂閱者ID(就像你的訂閱憑證)

subscribe(event: string, callBack: (value: string) => void) {this.subscriber = commonEventManager.createSubscriberSync({ events: [event] })commonEventManager.subscribe(this.subscriber, (err, value) => {callBack(value.data as string)})
}

2.訂閱功能詳解
就像訂閱雜志:

  1. createSubscriberSync({ events: [event] })
    → 告訴系統"我想訂閱這本周刊"(注冊訂閱者)
  2. commonEventManager.subscribe(...)
    → 實際訂閱動作
  3. (err, value) => { callBack(...) }
    → 當新期刊發布,系統通知你(回調) → 你收到后做處理(執行你提供的callBack函數)

3.調用示例

subscriberClass.subscribe('NEWS_UPDATE', (content) => {console.log('收到新聞:', content)
})

publish(event: string, data: string = '') {commonEventManager.publish(event, { data }, () => {})
}

5.HarmonyOS 公共事件機制實現卡片通信

在 HarmonyOS 中,卡片(Widget)是輕量化的 UI 組件,而公共事件機制是實現卡片與應用主程序之間通信的核心橋梁。讓我通過一個天氣預報卡片的完整案例來解釋

1.主應用向卡片發送數據(當應用主程序需要更新卡片顯示時)

// 在應用主程序中
import { commonEventManager } from '@kit.BasicServicesKit';// 準備要發送的天氣數據
const weatherData = {city: "北京",temp: "26℃",condition: "晴"
};// 發布帶數據的公共事件
commonEventManager.publish('WEATHER_CARD_UPDATE', { data: JSON.stringify(weatherData), isOrdered: false 
}, (err) => {if (err) {console.error('天氣更新失敗');} else {console.log('卡片天氣信息已更新');}
});

2.卡片向主應用發送請求

卡片需要主動請求更新數據時(如用戶刷新按鈕)

// 在卡片服務提供者(CardProvider)中
import { commonEventManager } from '@kit.BasicServicesKit';
import { formHost } from '@kit.FormKit';export class WeatherCardProvider extends FormExtensionAbility {// 處理卡片刷新操作按鈕onFormEvent(formId: string, message: string) {if (message === 'refresh') {// 發布請求刷新事件commonEventManager.publish('REQUEST_WEATHER_UPDATE', { formId }, (err) => {} // 回調省略);}}// 接收主應用更新(在CardProvider中訂閱事件)setupEvents() {commonEventManager.subscribe('WEATHER_CARD_UPDATE', (err, event) => {if (!err) {const data = JSON.parse(event.data);// 更新卡片UIformHost.updateForm(formId, {temperature: `${data.temp}`,weatherIcon: this.getWeatherIcon(data.condition)});}});}
}

3.主應用訂閱卡片請求事件

// 在應用主程序入口(如EntryAbility)
import { BusinessError, commonEventManager } from '@kit.BasicServicesKit';
import { featureAbility } from '@kit.AbilityKit';export default class EntryAbility extends Ability {onCreate() {// 訂閱卡片數據請求事件commonEventManager.subscribe('REQUEST_WEATHER_UPDATE', (err: BusinessError, event) => {if (!err) {// 調用天氣API獲取最新數據this.fetchWeatherData().then(latestData => {// 更新指定卡片this.updateSpecificCard(event.formId, latestData);});}});}// API獲取最新天氣數據private fetchWeatherData(): Promise<WeatherData> {/* API實現省略 */}// 更新指定卡片private updateSpecificCard(formId: string, data: WeatherData) {// 發布更新事件(帶卡片ID)commonEventManager.publish('UPDATE_CARD_' + formId, {data: JSON.stringify(data)});}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912328.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912328.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912328.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為云Flexus+DeepSeek征文|快速搭建Dify LLM應用開發平臺教程

【摘要】本文介紹基于華為云Flexus X實例快速部署Dify-LLM應用開發平臺的解決方案。通過創建云服務器&#xff08;2核4G配置&#xff09;、彈性公網IP&#xff08;300Mbps帶寬&#xff09;及安全組&#xff0c;實現平臺私有化部署。方案提供兩種計費模式&#xff08;按需197元/…

【blender】使用bpy對一個obj的不同mesh進行不同的材質貼圖(涉及對bmesh的操作)

BMesh 簡介 BMesh 是 Blender 中用于表示和操作網格數據的底層數據結構系統&#xff0c;它是傳統網格數據結構的高級替代品。 主要特點 靈活拓撲支持&#xff1a; 支持 n-gons&#xff08;任意邊數的多邊形&#xff09;&#xff0c;而不僅僅是三角形和四邊形允許邊和頂點不屬…

如何通過nvm切換本地node環境詳情教程(已裝過node.js更改成nvm)

針對系統已裝過node環境或者第一次安裝nvm環境如何切換nvm 文章目錄 系列文章目錄前言一、刪除原有node環境二、使用步驟 1.下載nvm軟件2.安裝node不同版本3.使用node版本4.配置包文件、安裝包、配置包環境 總結 一、刪除原有node環境 1、刪除之前安裝的node包&#xff0c;以及…

概率論符號和公式整理

本文是由AI生成后&#xff0c;經作者優化整理的文章。個人總結&#xff0c;僅限參考&#xff01; 以下整理了概率論中的常用符號和公式表格&#xff0c;覆蓋基礎知識、關鍵定理和常用分布&#xff1a; 一、基礎集合與事件符號 符號名稱含義/公式說明 S S S樣本空間所有可能結…

SpringSecurity是什么?

Spring Security是Spring生態中的安全框架&#xff0c;用于管理Web應用的認證與權限控制&#xff0c;支持多種登錄方式并集成防護機制&#xff0c;可防范CSRF/XSS等攻擊&#xff0c;保障企業級系統的安全性。 一、核心功能與定位 身份認證&#xff08;Authentication&#xff…

nt!IoSynchronousPageWrite函數分析之atapi!IdeReadWrite----非常重要

第一部分&#xff1a;預分析 1: kd> g Breakpoint 7 hit atapi!IdeReadWrite: f729cb2a 55 push ebp 1: kd> kc # 00 atapi!IdeReadWrite 01 atapi!IdeSendCommand 02 atapi!AtapiStartIo 03 atapi!IdeStartIoSynchronized 04 nt!KeSynchronizeExecuti…

軟考系統架構設計師經驗總結

本文目的 對參加的2025年上半年系統架構設計師考試進行總結提供一些備考思路給未來參加系統架構設計師的同學 個人背景 工作背景 本科計算機與技術&#xff08;學過一些計算機基礎課程&#xff09;&#xff0c;15年畢業后從事過b端&#xff08;人群畫像、營銷、用戶增長、硬…

Tailwind CSS工作原理

文章目錄 前言1. 指令解析與 AST 操作&#x1f6a9; **核心處理流程**&#x1f9e9; **具體流程說明** 2. **配置驅動的樣式生成**3. **JIT 模式&#xff08;Just-In-Time&#xff09;的核心邏輯**4. **插件與自定義擴展**5. **與 PostCSS 管道的協同**6. **優化與 Tree Shakin…

web網頁開發,在線%旅游景點管理%系統demo,基于Idea,vscode,html,css,vue,java,maven,springboot,mysql

經驗心得 兩業務單&#xff0c;都是業務邏輯開發&#xff0c;基本crud&#xff0c;什么是前后端&#xff0c;怎么分離前后端&#xff0c;前后端怎么通訊的&#xff0c;是以什么格式進行通訊這些咱們都需要掌握&#xff0c;后面剩下就是前后端不同層如何優化。管理系統很常見了其…

面試150 長度最小的子數組

思路 聯想到滑動窗口法。左窗口的值為0&#xff0c;遍歷數組對數組求和&#xff0c;當數組的和大于等于target的時候&#xff0c;窗口要收縮&#xff0c;計算子數組的長度&#xff0c;并及時更新最小的長度&#xff0c;左窗口右移。 class Solution:def minSubArrayLen(self,…

Python字典的查詢操作

一、前言 在 Python 中&#xff0c;字典&#xff08;dict&#xff09; 是一種非常常用的數據結構&#xff0c;以鍵值對&#xff08;Key-Value Pair&#xff09;形式存儲數據&#xff0c;支持快速查找、插入和刪除操作。 本文將系統性地介紹 Python 字典中常見的查詢操作方法&…

pyhton基礎【18】面向對象基礎一

目錄 一.面向對象 二.面向對象概述 三.類與對象 一.面向對象 Python中的面向對象編程OOP是一種編程范式&#xff0c;它使用對象來設計軟件。對象是具有屬性(稱為屬性)和可以執行的操作(稱為方法)的數據結構。 基礎概念 類&#xff1a;class 類是創建對象的藍圖或模板。它…

Requests源碼分析:面試考察角度自驗(初級)

簡單描述執行流程 Q:能簡單描述一下發送一個requests.get(url)請求時,在requests庫內部的主要執行流程嗎?(從調用get方法到收到響應) 入口委托: get() 方法內部調用 requests.request(GET, url)。Session 接管: request() 方法會獲取或隱式創建一個 Session 對象,并調用…

鴻蒙5:條件-循環-列表渲染

注意&#xff1a;博主有個鴻蒙專欄&#xff0c;里面從上到下有關于鴻蒙next的教學文檔&#xff0c;大家感興趣可以學習下 如果大家覺得博主文章寫的好的話&#xff0c;可以點下關注&#xff0c;博主會一直更新鴻蒙next相關知識 專欄地址: https://blog.csdn.net/qq_56760790/…

淺談AI大模型-MCP

MCP簡介 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文協議 &#xff09;&#xff0c;24年11月初的時候Anthropic發了一篇技術博客&#xff0c;推出了他們的模型上下文協議MCP&#xff0c;介紹了一種規范&#xff1a;應用如何為LLM提供上下文。官網稱MCP為AI應…

MySQL數據庫基礎概述

前言&#xff1a; MySQL作為全球應用最廣泛的開源關系型數據庫管理系統&#xff08;RDBMS&#xff09;?&#xff0c;憑借其高性能、高可靠性與零成本特性&#xff0c;已成為Web應用、企業系統的核心數據引擎。它遵循SQL標準&#xff0c;通過表結構實現數據的結構化存儲&#x…

桌面小屏幕實戰課程:DesktopScreen 16 HTTP

飛書文檔http://https://x509p6c8to.feishu.cn/docx/doxcnrxBs55qGn6xoysTcJpqwRf /home/kemp/work/esp/esp-idf/examples/protocols/http_request 源碼下載方式參考&#xff1a; 源碼下載方式 心知天氣 注冊賬號&#xff0c;申請產品&#xff0c;獲取密鑰 產品 天氣數據 H…

vs2019 + QT下 vs2019創建的項目打開ui文件失敗

問題: 在vs2019 QT模式下。使用2019創建工程后。點擊ui文件打開時。出現奔潰&#xff0c;如下圖 解決方式&#xff1a; ui文件->右鍵->打開方式->添加->程序->點擊三個點->qcreator(qt安裝目錄) ->設置為默認值->確定 點擊設置為默認值&#xff0c;點…

WPS之PPT鏤空效果實現

1、準備一張圖片&#xff0c;剪切存入剪貼板 2、把圖片設為背景 右鍵 》 設置背景格式 》 圖片或紋理填充 》 圖片填充選擇剪貼板 3、插入一個矩形覆蓋全圖&#xff0c;設置無線條漸變填充從左到右 4、插入圓角矩形 5、單擊小黃點調整弧度 6、選擇無線條幻燈片背景填充 7、插…

服務注冊中心的本質抉擇:從業務本質看AP與CP的終極之選

本文從服務注冊中心的本質職責出發&#xff0c;通過分析其核心功能、業務場景和技術約束&#xff0c;深入探討服務注冊中心在架構設計上應該優先保證AP還是CP特性。文章首先剖析服務注冊中心的根本使命&#xff0c;然后從分布式系統原理、生產實踐案例和性能表現三個維度進行對…