HarmonyOS应用开发学习笔记 UIAbility组件与UI的数据同步 EventHub、globalThis

1、 HarmoryOS Ability页面的生命周期

2、@Component自定义组件

3、HarmonyOS 应用开发学习笔记 ets组件生命周期

4、HarmonyOS 应用开发学习笔记 ets组件样式定义 @Styles装饰器:定义组件重用样式 @Extend装饰器:定义扩展组件样式

5、HarmonyOS 应用开发学习笔记 state状态管理概述

6、HarmonyOS应用开发学习笔记 包名、icon图标,应用名修改 UIAbility组件介绍、UIAbility启动模式、UIAbility组件基本用法

基于HarmonyOS的应用模型,可以通过以下两种方式来实现UIAbility组件与UI之间的数据同步。

项目 描述
EventHub 基于发布订阅模式来实现,事件需要先订阅后发布,订阅者收到消息后进行处理。
globalThis ArkTS引擎实例内部的一个全局对象,在ArkTS引擎实例内部都能访问。

一、使用EventHub进行数据通信

EventHub和android EventBus很类似,三部曲:

1、EventHub 声明订阅

复制代码
EventHub.on()
参数名 类型 必填 说明
event string 事件名称。
callback Function 事件回调,事件触发后运行。
复制代码
        this.context.eventHub.on('123', this.func1);
        this.context.eventHub.on('123', () => {
            console.log('call anonymous func 1');
        });

2、EventHub 发送消息,订阅回调

复制代码
EventHub.emit()
参数名 类型 必填 说明
event string 事件名称。
...args Object[] 可变参数,事件触发时,传递给回调函数的参数。
复制代码
  this.context.eventHub.emit('123');
  this.context.eventHub.emit('123', 1);
  this.context.eventHub.emit('123', 1, 2);  

3、EventHub 取消订阅

复制代码
EventHub.off()
参数名 类型 必填 说明
event string 事件名称。
callback Function 事件回调。如果不传callback,则取消订阅该事件下所有callback。
复制代码
        this.context.eventHub.on('123', this.func2);//取消指定方法的订阅
        this.context.eventHub.off('123');  //取消订阅"123"

4、示例

  • 订阅

    import UIAbility from '@ohos.app.ability.UIAbility';

    const TAG: string = '[Example].[Entry].[EntryAbility]';

    export default class EntryAbility extends UIAbility {
    func1(...data) {
    // 触发事件,完成相应的业务操作
    console.info(TAG, '1. ' + JSON.stringify(data));
    }

    复制代码
      onCreate(want, launch) {
          // 获取eventHub
          let eventhub = this.context.eventHub;
          // 执行订阅操作
          eventhub.on('event1', this.func1);
          eventhub.on('event1', (...data) => {
              // 触发事件,完成相应的业务操作
              console.info(TAG, '2. ' + JSON.stringify(data));
          });
      }

    }

  • 发送消息

    import common from '@ohos.app.ability.common';

    @Entry
    @Component
    struct Index {
    private context = getContext(this) as common.UIAbilityContext;

    复制代码
    eventHubFunc() {
      // 不带参数触发自定义"event1"事件
      this.context.eventHub.emit('event1');
      // 带1个参数触发自定义"event1"事件
      this.context.eventHub.emit('event1', 1);
      // 带2个参数触发自定义"event1"事件
      this.context.eventHub.emit('event1', 2, 'test');
      // 开发者可以根据实际的业务场景设计事件传递的参数
    }
    
    // 页面展示
    build() {
      // ...
    }

    }

  • 取消订阅

    // context为UIAbility实例的AbilityContext
    this.context.eventHub.off('event1');

二、使用globalThis进行数据同步

globalThis是ArkTS引擎实例内部的一个全局对象,引擎内部的UIAbility/ExtensionAbility/Page都可以使用,因此可以使用globalThis全局对象进行数据同步。

使用globalThis进行数据同步

1、使用

复制代码
//数据存入globalThis中
 globalThis.xxx= aa;
//需要使用的地方调用
let a=globalThis.xxx

AbilityA中保存数据一个字符串数据并挂载到globalThis上。

复制代码
import UIAbility from '@ohos.app.ability.UIAbility'

export default class AbilityA extends UIAbility {
    onCreate(want, launch) {
        globalThis.entryAbilityStr = 'AbilityA'; // AbilityA存放字符串"AbilityA"到globalThis
        // ...
    }
}

AbilityB中获取对应的数据

复制代码
import UIAbility from '@ohos.app.ability.UIAbility'

export default class AbilityB extends UIAbility {
    onCreate(want, launch) {
        // AbilityB从globalThis读取name并输出
        console.info('name from entryAbilityStr: ' + globalThis.entryAbilityStr);
        // ...
    }
}

组件之间也是如此

2、globalThis使用的注意事项

1) 存放名称不要相同

  • Stage模型下进程内的UIAbility组件共享ArkTS引擎实例,使用globalThis时需要避免存放相同名称的对象。例如AbilityA和AbilityB可以使用globalThis共享数据,在存放相同名称的对象时,先存放的对象会被后存放的对象覆盖。

2)用完将其赋值为null,以减少对应用内存的占用。

  • 对于绑定在globalThis上的对象,其生命周期与ArkTS虚拟机实例相同,建议在使用完成之后将其赋值为null,以减少对应用内存的占用。
相关推荐
kobesdu13 分钟前
【ROS2实战笔记-13】Foxglove Studio:ROS可视化工具的另一条路
笔记·机器人·自动驾驶·ros
勤劳的进取家16 分钟前
传输层基础
运维·开发语言·学习·php
Gary Studio19 分钟前
Frameworks学习预览
学习
for_ever_love__19 分钟前
UI学习:单例传值
学习·ui·ios·objective-c
The_superstar620 分钟前
2026.4.28衡山派学习复习笔记
笔记·学习
XD74297163621 分钟前
001. MSP430G2553 入门总述:从零开始学习这颗单片机
单片机·嵌入式硬件·学习·嵌入式·msp430g2553
wuxinyan12323 分钟前
大模型学习之路01:提示工程从入门到精通(第一篇)
人工智能·学习·提示词
for_ever_love__25 分钟前
UI学习:通知传值
学习·ui·ios·objective-c
周末也要写八哥25 分钟前
编程学习中的记=记忆还是记录?
学习
随风,奔跑27 分钟前
Git学习笔记
笔记·git·学习