在 HarmonyOS(鸿蒙)中,CommonEventManager
是用于 进程间通信(IPC) 与 事件订阅发布 的核心组件之一。它允许应用或系统模块发布事件、订阅事件,从而实现模块解耦、灵活通信。
📢 开天辟地 HarmonyOS(鸿蒙)——信息篇:CommonEventManager
✅ 一、CommonEventManager
是什么?
CommonEventManager
是 HarmonyOS 提供的 公共事件发布与订阅机制(Pub/Sub),用于:
- 系统事件监听(如:开机、网络变化、充电状态)
- 自定义事件发送(如模块间传递消息、状态通知)
- 进程间通信(IPC)基础手段之一
- 设备、服务之间的协同事件流转
相当于 Android 的
BroadcastReceiver
,但更轻量、性能更好,且支持跨设备分布式事件订阅。
✅ 二、核心能力
能力类别 | 说明 |
---|---|
订阅系统事件 | 监听如电池电量变化、网络状态、蓝牙开关等 |
发布/订阅自定义事件 | 应用模块之间通信(例如:播放状态通知,下载进度同步) |
进程间通信 | 不同 Ability、不同应用间传递事件,实现异步消息流 |
分布式事件 | 在多设备协同下,支持跨设备订阅与处理事件(需分布式使能) |
✅ 三、基本结构图
+--------------------+
| System Events |
| (battery, wifi...)|
+--------------------+
↓
+--------------------+ +--------------------+
| CommonEventManager|<------->| Your Application |
| (事件中心) | | (订阅/发布) |
+--------------------+ +--------------------+
↑
+--------------------+
| Other Apps / |
| Abilities / etc. |
+--------------------+
✅ 四、常用事件类型
🔹 1. 系统内置事件(部分示例)
事件名(event ) | 描述 |
---|---|
common.event.BATTERY_CHANGED | 电池状态变化 |
common.event.SCREEN_ON | 屏幕开启 |
common.event.SCREEN_OFF | 屏幕关闭 |
common.event.TIME_TICK | 每分钟时间更新 |
common.event.CONNECTIVITY_CHANGE | 网络连接状态变更 |
common.event.DEVICE_BOOT_COMPLETED | 设备启动完成 |
📌 查看完整事件列表:官方文档或使用 DevEco Studio 的提示智能补全。
🔹 2. 自定义事件(自定义字符串)
开发者可以使用自定义事件名称进行模块通信:
const CUSTOM_EVENT = 'com.example.CUSTOM_ACTION';
✅ 五、eTS 使用示例(发布 & 订阅)
🔄 1. 发布事件(系统或自定义)
import commonEvent from '@ohos.commonEvent';
const eventData: commonEvent.CommonEventData = {
event: 'com.example.CUSTOM_ACTION',
parameters: {
message: 'Hello from Module A',
time: Date.now()
}
};
commonEvent.publish(eventData)
.then(() => {
console.log('事件已发布');
})
.catch(err => {
console.error('发布失败:', err);
});
📥 2. 订阅事件
import commonEvent from '@ohos.commonEvent';
let subscriber;
const subscribeInfo: commonEvent.CommonEventSubscribeInfo = {
events: ['com.example.CUSTOM_ACTION', 'common.event.SCREEN_OFF']
};
commonEvent.createSubscriber(subscribeInfo)
.then(sub => {
subscriber = sub;
commonEvent.subscribe(subscriber, (eventData) => {
console.log(`收到事件: ${eventData.event}`);
console.log(`参数:`, eventData.parameters);
});
});
🧹 3. 取消订阅
commonEvent.unsubscribe(subscriber)
.then(() => {
console.log('已取消订阅');
});
✅ 六、进程间通信场景
场景 | 应用方式 |
---|---|
服务 Ability 与 UI Ability 通信 | UI 订阅,服务通过事件发布状态更新 |
多模块解耦通信 | 模块 A 发布事件,模块 B 订阅处理,实现逻辑隔离 |
异步任务状态同步 | 下载、上传等操作完成后,通过事件通知界面更新进度 |
与系统事件联动 | 如监听网络变化后重新连接、屏幕关闭暂停操作等逻辑处理 |
✅ 七、注意事项
注意点 | 说明 |
---|---|
❗ 事件名称需唯一、规范 | 自定义事件请使用命名空间风格,如 com.example.ACTION_NAME |
✅ 不同进程间通信需公共签名 | 应用间通信建议使用系统支持的权限校验或签名一致策略 |
🔐 部分系统事件需要权限 | 如监听开机完成、读取 SIM 卡状态等 |
⚠️ 避免发布高频事件 | 会影响性能,应避免发布太频繁的事件 |
✅ 八、系统事件权限声明(如需要)
例如,监听网络变化需要权限声明:
"reqPermissions": [
{
"name": "ohos.permission.GET_NETWORK_INFO",
"reason": "用于获取网络连接状态"
}
]
✅ 九、分布式通信(进阶)
如果你的应用运行在多设备(手机、手表、电视)之间,可通过 CommonEventManager
实现:
- 跨设备同步 UI 状态
- 多端业务状态广播
- 设备发现/协同事件传递
🧠 需搭配分布式能力(如 DMS、FA)实现远程事件同步。
✅ 十、总结
能力维度 | 描述 |
---|---|
发布订阅模式 | 模块解耦,提升架构灵活性 |
支持系统/自定义事件 | 监听电量、网络等系统事件,也支持自定义跨模块事件通信 |
支持跨进程通信 | 实现 Ability/应用间的状态通知与数据流转 |
易用性高 | API 简单,开发成本低,适合用于状态通知、解耦通信等多种场景 |
✅ 一句话总结:
CommonEventManager
是 HarmonyOS 中轻量高效的事件通信总线,让你轻松实现模块间解耦与多端协同。
如果你需要:
- 🔄 多事件订阅处理模板
- 📦 分布式事件跨设备同步示例
- 📋 自定义事件命名规范建议
可以继续告诉我,我可以为你准备好用的项目代码片段。是否继续深入「分布式通信」或「服务 Ability 与 UI 通信」内容?
发表回复