1. 项目概述
作为一名在物联网领域摸爬滚打多年的开发者,我深知公共事件和通知系统在鸿蒙生态中的重要性。这章内容将带你深入理解鸿蒙分布式系统中的事件机制,掌握通知功能的实现技巧。不同于简单的API调用教程,我会结合真实项目经验,分享那些官方文档没写的实战细节。
在鸿蒙物联网项目中,公共事件和通知就像是系统的"神经系统",负责各个模块间的信息传递。很多新手开发者容易陷入两个极端:要么过度依赖全局事件导致代码混乱,要么完全不用事件机制造成重复造轮子。本章将教你如何优雅地设计事件驱动架构。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 公共事件机制深度解析
2.1 鸿蒙事件模型设计原理
鸿蒙的公共事件服务基于发布-订阅模式,但做了分布式优化。每个事件包含:
- 事件名(必选):如"NETWORK_STATE_CHANGE"
- 事件数据(可选):Bundle类型,最大支持1MB
- 权限要求(可选):声明发送/接收权限
事件类型分为:
- 普通事件:应用内或跨应用
- 有序事件:按优先级顺序处理
- 粘性事件:可被后续订阅者接收
重要提示:粘性事件会常驻内存,务必在不需要时手动清除,否则可能引发内存泄漏。
2.2 事件注册与发送实战
注册事件订阅者的正确姿势:
java复制// 创建订阅者对象
CommonEventSubscriber subscriber = new CommonEventSubscriber(
new CommonEventSubscribeInfo.Builder()
.setEvent("DEVICE_STATUS_UPDATE") // 事件名
.setPriority(100) // 处理优先级
.setPermission("com.example.permission") // 接收权限
.build());
// 实现事件回调
subscriber.setReceiver(new CommonEventReceiver() {
@Override
public void onReceiveEvent(CommonEventData eventData) {
// 解析事件数据
String deviceId = eventData.getData().getString("deviceId");
int status = eventData.getData().getInt("status", -1);
// 处理逻辑...
}
});
// 注册订阅者
CommonEventManager.subscribe(subscriber);
发送事件的典型场景:
java复制// 准备事件数据
IntentParams params = new IntentParams();
params.setParam("deviceId", "thermo_001");
params.setParam("temperature", 26.5f);
// 构建事件
CommonEventData eventData = new CommonEventData(
new Intent()
.setAction("TEMPERATURE_ALERT") // 事件名
.setParams(params) // 事件参数
.setFlags(Intent.FLAG_STICKY_EVENT)); // 设为粘性事件
// 发送事件
CommonEventManager.publish(eventData);
2.3 分布式事件传递机制
鸿蒙的分布式能力让事件可以跨设备传递,这是其核心优势之一。实现要点:
- 设备发现:通过
DeviceManager获取组网设备列表 - 权限声明:在
config.json中配置分布式权限
json复制"reqPermissions": [
{
"name": "ohos.permission.DISTRIBUTED_DATASYNC",
"reason": "跨设备事件同步"
}
]
- 事件路由:通过
setDeviceId()指定目标设备,留空则广播到所有设备
实测发现:跨设备事件延迟通常在50-200ms之间,建议对实时性要求高的场景做本地缓存。
3. 通知系统高级应用
3.1 鸿蒙通知架构解析
鸿蒙的通知系统采用三层架构:
- 应用层:创建和发送通知
- 框架层:管理通知通道、排序策略
- 服务层:实际展示和交互
通知的重要属性包括:
- 渠道ID(必须):Android 8.0引入的概念,鸿蒙做了兼容
- 重要性级别:从URGENT到LOW共5级
- 可见性:PUBLIC、PRIVATE、SECRET
- 持续时长:SHORT、LONG、FOREVER
3.2 创建富媒体通知的最佳实践
一个完整的设备状态通知示例:
java复制// 创建通知请求
NotificationRequest request = new NotificationRequest()
.setContentTitle("空调异常")
.setContentText("客厅空调温度传感器故障")
.setSmallIcon(ResourceTable.Media_icon_alert)
.setLargeIcon(loadBitmapFromResource(ResourceTable.Media_img_ac));
// 添加动作按钮
NotificationAction action = new NotificationAction.Builder(
ResourceTable.Media_icon_settings,
"立即检修",
new IntentAgentHelper.IntentAgentWrapper(
context,
new IntentAgentHelper.IntentAgentInfo(
IntentAgentHelper.FLAG_UPDATE_PR
