HarmonyOS鸿蒙Next中如何在entryability实现一个全局监听器
HarmonyOS鸿蒙Next中如何在entryability实现一个全局监听器
我想做一个全局的监听在app里面的我的自定义事件 但是没有对应的api
定义全局事件管理器类-----
// 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
// 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中,可通过UIAbility
的onCreate
或onWindowStageCreate
实现全局监听器。使用AbilityContext
的registerAbilityLifecycleCallback
注册生命周期监听,或通过EventHub
进行跨组件通信。示例代码:
// 在EntryAbility的onCreate中
onCreate() {
this.context.eventHub.on('globalEvent', (data) => {
// 处理事件
});
}
// 其他组件触发
this.context.eventHub.emit('globalEvent', {key: value});
注意:EventHub
仅在当前Ability有效,跨Ability需使用AbilityContext
或公共文件管理状态。
在HarmonyOS Next中,可以通过以下方式在EntryAbility中实现全局事件监听:
- 使用EventHub实现全局事件总线:
// 在EntryAbility中定义
private eventHub: EventHub = new EventHub();
onCreate(want: Want) {
// 注册全局事件监听
this.eventHub.on('customEvent', (data) => {
console.log('收到自定义事件:', data);
});
}
// 获取EventHub实例供其他模块使用
getEventHub(): EventHub {
return this.eventHub;
}
- 在应用其他模块中触发事件:
// 获取Ability实例
let abilityContext = ...; // 通过getContext等方式获取
let entryAbility = abilityContext as EntryAbility;
// 触发事件
entryAbility.getEventHub().emit('customEvent', {key: 'value'});
- 如果需要跨进程通信,可以使用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是进程内通信机制,跨进程需要使用分布式能力
- 记得在适当时候取消事件监听,避免内存泄漏
- 事件名建议使用常量定义,避免拼写错误