概述
基本概念
EventHub(事件管理中心)是系统为开发者提供的一种事件管理机制,包含事件订阅、事件注销、事件发送等功能。目的是为了方便开发者在不同组件之间进行通信。
实现原理
EventHub内部持有了一个key-value的数据结构,当事件接收方订阅事件后,EventHub会以事件名为key,回调函数为value将其保存下来。当事件发送方发送事件时,EventHub根据事件名查找对应回调函数,然后调用回调函数完成事件通知。
原理图
约束与限制
- EventHub只有Stage模型的应用才可以使用
- 在发送和接收事件时需要使用同一个context实例里面的EventHub
- EventHub采用的是key-value存储,如果在同一个EventHub中订阅了同名的事件,后面订阅的事件会被直接丢弃掉
开发步骤
事件接收方
- 保存context实例到globalThis中。
事件发送方和接收方需要使用同一个context实例中的EventHub才可以进行通信,所以这里把context实例保存到globalThis中,接收方才能拿到这个context实例。 - 编写回调函数
编写收到事件后需要进行的业务处理函数。 - 订阅事件
调用context接口中的eventHub.on来订阅事件
import Ability from '@ohos.application.Ability'
export default class MainAbility extends Ability {
onCreate(want, launchParam) {
console.log("[Demo] MainAbility onCreate")
globalThis.abilityWant = want;
// 1. 保存context实例到globalThis中。
globalThis.context = this.context;
}
onDestroy() {
console.log("[Demo] MainAbility onDestroy")
}
onWindowStageCreate(windowStage) {
// Main window is created, set main page for this ability
console.log("[Demo] MainAbility onWindowStageCreate")
globalThis.startOtherAbility = () => {
let want = {
"bundleName": "com.example.eventhub",
"abilityName": "MainAbility1"
}
this.context.startAbility(want);
}
// 2. 创建回调函数
let callback = (a, b) => {
console.log("a + b = " + (a + b))
}
// 3. 订阅事件
globalThis.context.eventHub.on("calculate",callback);
windowStage.loadContent("pages/index", (err, data) => {
if (err.code) {
console.error('Failed to load the content. Cause:' + JSON.stringify(err));
return;
}
console.info('Succeeded in loading the content. Data: ' + JSON.stringify(data))
});
}
onWindowStageDestroy() {
// Main window is destroyed, release UI related resources
console.log("[Demo] MainAbility onWindowStageDestroy")
}
onForeground() {
// Ability has brought to foreground
console.log("[Demo] MainAbility onForeground")
}
onBackground() {
// Ability has back to background
console.log("[Demo] MainAbility onBackground")
}
};
事件发送方
- 使用和接收方同一个context实例,调用其中的eventHub.emit发送事件
import Ability from '@ohos.application.Ability'
export default class MainAbility1 extends Ability {
onCreate(want, launchParam) {
console.log("[Demo] MainAbility onCreate")
globalThis.abilityWant = want;
}
onDestroy() {
console.log("[Demo] MainAbility onDestroy")
}
onWindowStageCreate(windowStage) {
// Main window is created, set main page for this ability
console.log("[Demo] MainAbility onWindowStageCreate")
globalThis.sendData = () => {
// 1. 调用同一个context实例发送事件
globalThis.context.eventHub.emit("calculate");
}
windowStage.loadContent("pages/index1", (err, data) => {
if (err.code) {
console.error('Failed to load the content. Cause:' + JSON.stringify(err));
return;
}
console.info('Succeeded in loading the content. Data: ' + JSON.stringify(data))
});
}
onWindowStageDestroy() {
// Main window is destroyed, release UI related resources
console.log("[Demo] MainAbility onWindowStageDestroy")
}
onForeground() {
// Ability has brought to foreground
console.log("[Demo] MainAbility onForeground")
}
onBackground() {
// Ability has back to background
console.log("[Demo] MainAbility onBackground")
}
};
网友评论