鸿蒙HarmonyOS NEXT之无感监听

鸿蒙中存在一些无感监听,这些监听经过系统API封装使用很简单,但是对实际业务开发中有很重要,例如埋点业务、数据统计、行为上报、切面拦截等。

在鸿蒙中Navigation被用来作为路由栈进行页面跳转,如果你想知道页面的路由栈,以及前后切换的页面,可以通过官方提供的无感监听的页面切换navDestinationSwitch。

plain 复制代码
  private _navDestinationListener() {
    this.uiContext?.getUIObserver()
      .on('navDestinationSwitch', (info: uiObserver.NavDestinationSwitchInfo) => {
        let to = info.to;
        if (to != 'navBar') {
          let navName = `${to.name.toString()}#${to.navDestinationId}`;
        }
      });
  }
plain 复制代码
    this.uiContext?.getUIObserver().off('navDestinationSwitch');

点击事件的监听

通过对系统控件设置customProperty,可以通过didClick进行点击事件拦截,相当于对全部的系统控件可以hook处理。

plain 复制代码
  @Builder
  TabBuilder(index: number, controller: TabsController) {
    Column() {
      this.CanvasComponent(index, this.getCanvasRenderingContext())
    }
    .onClick(() => {
    }).layoutWeight(1)
    .customProperty('customPropertyKey', 'value')
  }
plain 复制代码
 private _didClickListener() {
    this.uiContext?.getUIObserver().on('didClick', (event: GestureEvent, frameNode?: FrameNode) => {
      if (frameNode == null) {
        return;
      }
       frameNode.getCustomProperty('customPropertyKey')
    });
  }
plain 复制代码
    this.uiContext?.getUIObserver().off('didClick');

监听TabContent页面的切换事件

在鸿蒙中页签Tabs控件的使用频率比较高,如果想知道哪个子TabContent被点击了,就可以使用监听TabContent页面的切换事件。

plain 复制代码
 private _tabContentUpdateListener() {
    this.uiContext?.getUIObserver().on('tabContentUpdate', (info: uiObserver.TabContentInfo) => {
      if (info.state != uiObserver.TabContentState.ON_SHOW) {
        return;
      }
      this._handleContentUpdateEvent(info.id, info.uniqueId, info.index, info.tabContentUniqueId, true);
      let frameNode = this.uiContext?.getFrameNodeByUniqueId(info.tabContentUniqueId);
    });
  }
plain 复制代码
    this.uiContext?.getUIObserver().off('tabContentUpdate');

![](https://i-blog.csdnimg.cn/img_convert/19cb50e8b0bf17ea2a72d203739ce9cc.png)

Aspect插桩能力

Aspect类用于封装提供切面能力(Aspect Oriented Programming,简写AOP)的接口,这些接口可以用来对类方法进行前后插桩或者替换实现。

在指定的类对象的原方法执行前插入一个函数。addBefore接口执行完成后,都会先执行插入的函数逻辑,再执行指定类对象的原方法。

在指定的类方法执行后插入一段逻辑。最终返回值是插入函数执行后的返回值。

通过插桩处理,在弹框前后做一些逻辑,例如在弹框前后设置变量,就可以判断弹框是否有触发。

plain 复制代码
 util.Aspect.addBefore(CustomDialogController, 'open', false, () => {
      AppStorage.setOrCreate(BusinessUseConstant.CUSTOMDIALOG_ISOPEN, true)
    });
    util.Aspect.addBefore(CustomDialogController, 'close', false, () => {
      AppStorage.setOrCreate(BusinessUseConstant.CUSTOMDIALOG_ISOPEN, false)
    });
相关推荐
飞羽殇情20 分钟前
基于React Native鸿蒙跨平台开发构建完整电商预售系统数据模型,完成参与预售、支付尾款、商品信息展示等
react native·react.js·华为·harmonyos
Betelgeuse761 小时前
【Flutter For OpenHarmony】TechHub技术资讯界面开发
flutter·ui·华为·交互·harmonyos
国服第二切图仔2 小时前
openJiuwen智能体平台部署搭建及政务通助手工作流智能体开发实战
华为·政务·智能体
大雷神2 小时前
HarmonyOS智慧农业管理应用开发教程--高高种地-- 第33篇:应用打包、签名与发布
华为·harmonyos
mocoding2 小时前
使用已经完成鸿蒙化适配的Flutter本地持久化存储三方库shared_preferences让你的应用能够保存用户偏好设置、缓存数据等
flutter·华为·harmonyos·鸿蒙
zhuweisky4 小时前
ArkTS实现鸿蒙手机视频聊天、屏幕分享(HarmonyOS)
音视频·harmonyos·鸿蒙开发
大雷神5 小时前
HarmonyOS智慧农业管理应用开发教程--高高种地--第32篇:应用测试、优化与调试
华为·harmonyos
前端不太难5 小时前
HarmonyOS 游戏中,被“允许”的异常
游戏·状态模式·harmonyos
木斯佳5 小时前
HarmonyOS 6实战(源码教学篇)— MindSpore Lite Kit 【从证件照工具到端侧图像分割技术全解析】
华为·harmonyos
三声三视5 小时前
HarmonyOS 路由框架 HMRouter 全解析:从原理到实践
华为·harmonyos