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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;然后从分布式系统原理、生产实践案例和性能表现三个维度进行对…