HarmonyOS鸿蒙Next中应用如何通知广播EventHub的使用
HarmonyOS鸿蒙Next中应用如何通知广播EventHub的使用
鸿蒙应用如何通知广播EventHub的使用
一、结论
通知广播,见名知意,是为了实现将信息,通知给所有人的一种程序方式。那代码中对于信息的形态,通知给所有人的范围就会有定义。
一般而言通知广播会有一个注册key的实例来处理所有广播。每一个广播的发送也是通过这个key发给所有人进行广播。
举一个栗子,我有三家报社有订阅会员机制,报社分别是ABC三家。 对于想看A报社的人来说,只需要去A报社进行订阅即可。这个订阅行为在代码中就是注册key的过程。相应的广播方式,当然也是根据是否有订阅来决定。
其实鸿蒙中的事件广播迭代版本很有意思,在api7的时代,系统应用源码中就就已经有工具类的存在,eventBus的使用很多,例如相机的源码。相机各种状态同步给所有view,基本都是通过广播的形式通知。
虽然鸿蒙中对于子母组件有各种状态同步和监听机制,但是在纯逻辑处理类中就不适用了。所以才会有事件通知广播的场景需求。
随着鸿蒙API的版本迭代,在API10正式将给工具类并入到了系统接口中,方便大家的使用。
曾几何时,多年前我还在开发Openharmony时,都是自己封装的EventBusMgr使用,现在可以直接替换为官网api。基本无感知替换。可见该工具类的受欢迎程度。
二、代码实现和详细解释
EventHub被存放在context上下文中,是单例模式,只有一个。每次可通过上下文获取到该实例。
该实例共有三个函数,分别是emit发送广播,on监听广播,off取消监听广播。
广播发送的包裹可以是任意类型。
import { BusinessError } from '@kit.BasicServicesKit';
import { promptAction } from '@kit.ArkUI';
import { common } from '@kit.AbilityKit';
@Entry
@Component
struct EventHubPage {
private TAG: string = "EventHubPage";
private noticeIsDone: boolean = false;
private TEST_KEY: string = "TEST_KEY";
private eventHub(){
let context = getContext() as common.UIAbilityContext;
return context.eventHub;
}
// 这里是收到广播的回调处理
onTestKey = (noticeIsDone: boolean)=>{
if(noticeIsDone){
this.showToast("收到通知,完成!");
}else{
this.showToast("收到通知,失败!");
}
}
onClickNotice = ()=>{
this.noticeIsDone = !this.noticeIsDone;
// 第二个参数就是需要广播出去的包裹,这里我以boolean类型举例
this.eventHub().emit(this.TEST_KEY, this.noticeIsDone);
}
onClickRegister = ()=>{
this.eventHub().on(this.TEST_KEY, this.onTestKey);
this.showToast("注册监听成功!");
}
onClickUnRegister = ()=>{
this.eventHub().off(this.TEST_KEY, this.onTestKey);
this.showToast("取消注册监听!");
}
private showToast(content: string){
try {
promptAction.showToast({
message: content,
duration: 2000
});
} catch (error) {
let message = (error as BusinessError).message
let code = (error as BusinessError).code
console.error(this.TAG, `showToast args error code is ${code}, message is ${message}`);
};
}
/**
* 统一样式封装
*/
@Styles ButtonStyle(){
.width(px2vp(350))
.height(px2vp(200))
.margin({ top: px2vp(66) })
}
build() {
Column(){
Button("发送广播")
.ButtonStyle()
.onClick(this.onClickNotice)
Button("设置注册监听")
.ButtonStyle()
.onClick(this.onClickRegister)
Button("取消注册监听")
.ButtonStyle()
.onClick(this.onClickUnRegister)
}.size({
width: "100%",
height: "100%"
})
}
}
注意:封装唯一性。因为在不同window中会导致获取的eventhub 不是一个。
import { common } from '@kit.AbilityKit';
export class EventHubUtils {
private static mEventHub: common.EventHub | null = null;
/**
* 获取事件通知实例
* @returns
*/
public static getEventHub(){
// 封装唯一性。因为在不同window中会导致获取的eventhub 不是一个。
if(!EventHubUtils.mEventHub){
let context = getContext() as common.UIAbilityContext;
EventHubUtils.mEventHub = context.eventHub;
console.log("EventHubUtils", "EventIns mEventHub done !");
}
return EventHubUtils.mEventHub;
}
}
更多关于HarmonyOS鸿蒙Next中应用如何通知广播EventHub的使用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
EventHub
HarmonyOS Next中EventHub用于应用内组件间通信,支持订阅、发布、取消订阅事件。
使用步骤
- 导入
@ohos.commonEventManager模块; - 调用
createEventHub创建实例; - 通过
on方法订阅指定事件; - 使用
emit触发事件并传递数据; - 通过
off取消订阅。
适用场景
EventHub适用于同一应用内UI组件与Service等跨线程通信场景。
在HarmonyOS Next中,EventHub是应用内组件间通信的核心机制,用于实现基于事件的松散耦合通信。它替代了传统的广播机制,更高效、安全。以下是关键使用方式:
-
获取EventHub实例:通过UIAbilityContext或AbilityStage的context获取。
let eventHub = this.context.eventHub; -
触发事件:使用
emit方法发布事件,可携带数据。eventHub.emit('eventName', { data: 'example' }); -
订阅事件:使用
on方法注册监听器接收事件。eventHub.on('eventName', (data) => { // 处理事件数据 }); -
取消订阅:使用
off移除指定监听器或全部监听。eventHub.off('eventName', callback);
注意事项:
- EventHub适用于同一UIAbility内组件通信,跨UIAbility需用Ability间通信(如Want)。
- 避免内存泄漏:组件销毁前取消订阅。
- 事件名建议常量管理,避免硬编码。
这种方式比传统广播更轻量,且无需权限声明,直接通过上下文操作即可完成组件间数据传递。

