EventHub使用指南

概述

基本概念

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ā)步驟

事件接收方

  1. 保存context實例到globalThis中。
    事件發(fā)送方和接收方需要使用同一個context實例中的EventHub才可以進行通信,所以這里把context實例保存到globalThis中,接收方才能拿到這個context實例。
  2. 編寫回調(diào)函數(shù)
    編寫收到事件后需要進行的業(yè)務(wù)處理函數(shù)。
  3. 訂閱事件
    調(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ā)送方

  1. 使用和接收方同一個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")
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容