美文网首页Android开发
EventHub使用指南

EventHub使用指南

作者: 小阿牛的爸爸 | 来源:发表于2022-08-15 11:59 被阅读0次

    概述

    基本概念

    EventHub(事件管理中心)是系统为开发者提供的一种事件管理机制,包含事件订阅、事件注销、事件发送等功能。目的是为了方便开发者在不同组件之间进行通信。

    实现原理

    EventHub内部持有了一个key-value的数据结构,当事件接收方订阅事件后,EventHub会以事件名为key,回调函数为value将其保存下来。当事件发送方发送事件时,EventHub根据事件名查找对应回调函数,然后调用回调函数完成事件通知。


    原理图

    约束与限制

    • EventHub只有Stage模型的应用才可以使用
    • 在发送和接收事件时需要使用同一个context实例里面的EventHub
    • EventHub采用的是key-value存储,如果在同一个EventHub中订阅了同名的事件,后面订阅的事件会被直接丢弃掉

    开发步骤

    事件接收方

    1. 保存context实例到globalThis中。
      事件发送方和接收方需要使用同一个context实例中的EventHub才可以进行通信,所以这里把context实例保存到globalThis中,接收方才能拿到这个context实例。
    2. 编写回调函数
      编写收到事件后需要进行的业务处理函数。
    3. 订阅事件
      调用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")
        }
    };
    

    事件发送方

    1. 使用和接收方同一个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")
        }
    };
    

    相关文章

      网友评论

        本文标题:EventHub使用指南

        本文链接:https://www.haomeiwen.com/subject/bnbrgrtx.html