概述
基本概念
EventHub(事件管理中心)是系統(tǒng)為開發(fā)者提供的一種事件管理機制,包含事件訂閱、事件注銷、事件發(fā)送等功能。目的是為了方便開發(fā)者在不同組件之間進行通信。
實現(xiàn)原理
EventHub內(nèi)部持有了一個key-value的數(shù)據(jù)結(jié)構(gòu),當事件接收方訂閱事件后,EventHub會以事件名為key,回調(diào)函數(shù)為value將其保存下來。當事件發(fā)送方發(fā)送事件時,EventHub根據(jù)事件名查找對應(yīng)回調(diào)函數(shù),然后調(diào)用回調(diào)函數(shù)完成事件通知。
原理圖
約束與限制
- EventHub只有Stage模型的應(yīng)用才可以使用
- 在發(fā)送和接收事件時需要使用同一個context實例里面的EventHub
- EventHub采用的是key-value存儲,如果在同一個EventHub中訂閱了同名的事件,后面訂閱的事件會被直接丟棄掉
開發(fā)步驟
事件接收方
- 保存context實例到globalThis中。
事件發(fā)送方和接收方需要使用同一個context實例中的EventHub才可以進行通信,所以這里把context實例保存到globalThis中,接收方才能拿到這個context實例。 - 編寫回調(diào)函數(shù)
編寫收到事件后需要進行的業(yè)務(wù)處理函數(shù)。 - 訂閱事件
調(diào)用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. 創(chuàng)建回調(diào)函數(shù)
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")
}
};
事件發(fā)送方
- 使用和接收方同一個context實例,調(diào)用其中的eventHub.emit發(fā)送事件
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. 調(diào)用同一個context實例發(fā)送事件
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")
}
};