美文网首页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-任意组件通信

    什么是EventHub EventHub本质上是基于发布订阅模式来实现的,可以将EventHub理解为发布订阅模式...

  • 发布订阅模式

    事件中心:eventhub

  • Vue: EventHub 和 Vue 更配哦

    EventHub 是一个非常重要且常用的东西,在不相关组件通信方面有着很强大的作用。 EventHub 想想如果从...

  • 手写eventhub

  • 手写EventHub

    实现EventHub 在文件1中的f1需要在某种情况下调用文件2中的f2, 用全局变量是不好的,此时可以通过创建一...

  • 4.组件通信-eventHub

    1.回顾 2.使用eventHub实现通信

  • 实现一个简单的EventHub

    前言 谈到EventHub就不得不说到发布订阅这一种设计模式,EventHub正是基于这种设计模式实现出来的一个实...

  • Vue开发小技巧

    1、全局变量 Vue.prototype.GLOBALAPI = GLOBALAPI; 2、EventHub le...

  • input1 整体框架

    基本框架:EventHub-->InputReader-->InputDispatcher app 端数据接受是s...

  • Gson使用指南 2017-08-15

    Gson使用指南系列其它文章你真的会用Gson吗?Gson使用指南(一)你真的会用Gson吗?Gson使用指南(二...

网友评论

    本文标题:EventHub使用指南

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