HarmonyOS鸿蒙Next中如何在entryability实现一个全局监听器

HarmonyOS鸿蒙Next中如何在entryability实现一个全局监听器

我想做一个全局的监听在app里面的我的自定义事件 但是没有对应的api

6 回复

定义全局事件管理器类-----

// common/EventManager.ets
export class EventManager {
  private static instance: EventManager;
  private listeners: Map<string, Function[]> = new Map();

  static getInstance(): EventManager {
    if (!EventManager.instance) {
      EventManager.instance = new EventManager();
    }
    return EventManager.instance;
  }

  // 注册事件监听
  on(eventName: string, callback: Function): void {
    if (!this.listeners.has(eventName)) {
      this.listeners.set(eventName, []);
    }
    this.listeners.get(eventName)?.push(callback);
  }

  // 触发事件
  emit(eventName: string, ...args: any[]): void {
    const callbacks = this.listeners.get(eventName);
    callbacks?.forEach(callback => {
      try {
        callback(...args);
      } catch (error) {
        hilog.error(0x0000, 'EventManager', `Event callback error: ${error}`);
      }
    });
  }

  // 移除监听
  off(eventName: string, callback: Function): void {
    const callbacks = this.listeners.get(eventName);
    if (callbacks) {
      this.listeners.set(eventName, callbacks.filter(cb => cb !== callback));
    }
  }
}

初始化并挂载到全局上下文----

// entryability/EntryAbility.ets
import { GlobalContext } from '../common/GlobalContext';
import { EventManager } from '../common/EventManager';

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 初始化全局事件管理器
    GlobalContext.getContext().setObject('eventManager', EventManager.getInstance());
  }
}

使用事件-----

// 注册监听器
const eventManager = GlobalContext.getContext().getObject('eventManager') as EventManager;
eventManager.on('customEvent', (data: any) => {
  hilog.info(0x0000, 'testTag', `Received event data: ${JSON.stringify(data)}`);
});

// 触发事件
eventManager.emit('customEvent', { key: 'value' });

更多关于HarmonyOS鸿蒙Next中如何在entryability实现一个全局监听器的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


可以用全局状态管理,

基于StateStore的全局状态管理

基于StateStore的全局状态管理-声明式语法 - 华为HarmonyOS开发者

// entry\src\main\ets\entryability\EntryAbility.ets uiContext.getUIObserver()?.on(‘willClick’, (_event: ClickEvent, node?: FrameNode) => { // 全局监听事件 })

在做应用埋点时,通常都会用到,全局监听事件:

在EntryAbility中注册点击事件监听,在事件回调中获取触发节点。UIObserver一共提供了两种监听事件:

  • on(“willClick”):用于监听点击事件指令下发情况,所注册回调将于点击事件触发前触发。

  • on(“didClick”):用于监听点击事件指令下发情况,所注册回调将于点击事件触发后触发

https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-application-track-practice

我事件不是点击只是一个动态值的变化呢,

在HarmonyOS Next中,可通过UIAbilityonCreateonWindowStageCreate实现全局监听器。使用AbilityContextregisterAbilityLifecycleCallback注册生命周期监听,或通过EventHub进行跨组件通信。示例代码:

// 在EntryAbility的onCreate中
onCreate() {
  this.context.eventHub.on('globalEvent', (data) => {
    // 处理事件
  });
}

// 其他组件触发
this.context.eventHub.emit('globalEvent', {key: value});

注意:EventHub仅在当前Ability有效,跨Ability需使用AbilityContext或公共文件管理状态。

在HarmonyOS Next中,可以通过以下方式在EntryAbility中实现全局事件监听:

  1. 使用EventHub实现全局事件总线:
// 在EntryAbility中定义
private eventHub: EventHub = new EventHub();

onCreate(want: Want) {
    // 注册全局事件监听
    this.eventHub.on('customEvent', (data) => {
        console.log('收到自定义事件:', data);
    });
}

// 获取EventHub实例供其他模块使用
getEventHub(): EventHub {
    return this.eventHub;
}
  1. 在应用其他模块中触发事件:
// 获取Ability实例
let abilityContext = ...; // 通过getContext等方式获取
let entryAbility = abilityContext as EntryAbility;

// 触发事件
entryAbility.getEventHub().emit('customEvent', {key: 'value'});
  1. 如果需要跨进程通信,可以使用AbilityContext的EventHub:
// 在EntryAbility中
onCreate(want: Want) {
    this.context.eventHub.on('crossProcessEvent', (data) => {
        console.log('收到跨进程事件:', data);
    });
}

// 在其他Ability中触发
let context = ...; // 获取context
context.eventHub.emit('crossProcessEvent', {data: 'value'});

注意事项:

  • EventHub是进程内通信机制,跨进程需要使用分布式能力
  • 记得在适当时候取消事件监听,避免内存泄漏
  • 事件名建议使用常量定义,避免拼写错误
回到顶部