鸿蒙:创建公共事件、订阅公共事件和退订公共事件

1. 前言

想获取电量过低的状态、电池充电或断电状态、屏幕解锁或锁定等公共事件时,我们可以通过commonEventManager 接口实现相关能力。

2. 参考文档

https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-commoneventmanagerhttps://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-commoneventmanager

https://developer.huawei.com/consumer/cn/doc/harmonyos-references/commoneventmanager-definitionshttps://developer.huawei.com/consumer/cn/doc/harmonyos-references/commoneventmanager-definitions

nullhttps://developer.huawei.com/consumer/cn/doc/harmonyos-guides/common-event-subscription

3. 核心思路

  1. 创建订阅信息
  2. 订阅公共事件
  3. 取消订阅

4. 核心代码

复制代码
// 创建订阅
createSubscriber(): void {
  // 订阅者信息:配置需要监听的公共事件
  let subscribeInfo: commonEventManager.CommonEventSubscribeInfo = {
    events: [
      'usual.event.POWER_CONNECTED', // 设备充电事件
      'usual.event.BATTERY_LOW',// 电池低电量事件
    ],
  };

  // 1. 创建订阅者
  commonEventManager.createSubscriber(subscribeInfo,
    (err: BusinessError, subscriber: commonEventManager.CommonEventSubscriber) => {
      if (err) {
        hilog.error(DOMAIN_NUMBER, TAG, `创建订阅者失败: ${err.message}`);
        return;
      }
      this.showDialog("创建订阅成功")
      hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in creating subscriber.');
      // 【关键】保存订阅者对象到成员变量,后续取消订阅需用到它
      this.subscriber = subscriber;
    }
  );
}

// 订阅事件
subscribe(): void {
  commonEventManager.subscribe(this.subscriber, (subErr, eventData) => {
    if (subErr) {
      hilog.error(DOMAIN_NUMBER, TAG, `订阅事件失败: ${subErr.message}`);
      return;
    }

    this.showDialog(`订阅事件触发成功:${JSON.stringify(eventData)}`)
    hilog.info(DOMAIN_NUMBER, TAG, `事件触发成功!数据: ${JSON.stringify(eventData)}`);
  });
}

// 取消订阅事件
unsubscribe(): void {
  if (this.subscriber !== null) {
    commonEventManager.unsubscribe(this.subscriber, (err: BusinessError) => {
      if (err) {
        hilog.error(DOMAIN_NUMBER, TAG, `取消订阅失败: ${err.message}`);
        return;
      }
      this.showDialog("取消订阅成功")
      hilog.info(DOMAIN_NUMBER, TAG, '成功取消订阅事件');
    });
  }
}

5. 完整代码

Index.ets

复制代码
import { BusinessError, commonEventManager } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';

const TAG: string = 'ProcessModel';
const DOMAIN_NUMBER: number = 0xFF00;

@Entry
@ComponentV2
struct Index {
  // 【关键】将订阅者对象提升为组件成员变量,供"取消订阅"时使用
  private subscriber: commonEventManager.CommonEventSubscriber | null = null;

  // 弹窗
  showDialog(mes: string): void {
    this.getUIContext().showAlertDialog({ message: mes })
  }

  // 创建订阅
  createSubscriber(): void {
    // 订阅者信息:配置需要监听的公共事件
    let subscribeInfo: commonEventManager.CommonEventSubscribeInfo = {
      events: [
        'usual.event.POWER_CONNECTED', // 设备充电事件
        'usual.event.BATTERY_LOW',// 电池低电量事件
      ],
    };

    // 1. 创建订阅者
    commonEventManager.createSubscriber(subscribeInfo,
      (err: BusinessError, subscriber: commonEventManager.CommonEventSubscriber) => {
        if (err) {
          hilog.error(DOMAIN_NUMBER, TAG, `创建订阅者失败: ${err.message}`);
          return;
        }
        this.showDialog("创建订阅成功")
        hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in creating subscriber.');
        // 【关键】保存订阅者对象到成员变量,后续取消订阅需用到它
        this.subscriber = subscriber;
      }
    );
  }

  // 订阅事件
  subscribe(): void {
    commonEventManager.subscribe(this.subscriber, (subErr, eventData) => {
      if (subErr) {
        hilog.error(DOMAIN_NUMBER, TAG, `订阅事件失败: ${subErr.message}`);
        return;
      }

      this.showDialog(`订阅事件触发成功:${JSON.stringify(eventData)}`)
      hilog.info(DOMAIN_NUMBER, TAG, `事件触发成功!数据: ${JSON.stringify(eventData)}`);
    });
  }

  // 取消订阅事件
  unsubscribe(): void {
    if (this.subscriber !== null) {
      commonEventManager.unsubscribe(this.subscriber, (err: BusinessError) => {
        if (err) {
          hilog.error(DOMAIN_NUMBER, TAG, `取消订阅失败: ${err.message}`);
          return;
        }
        this.showDialog("取消订阅成功")
        hilog.info(DOMAIN_NUMBER, TAG, '成功取消订阅事件');
      });
    }
  }

  build() {
    Column({ space: 150 }) {
      Text("公共事件订阅示例")
        .fontSize(20)

      Column({ space: 20 }) {
        Button("1、创建订阅事件").onClick((event: ClickEvent) => {

          this.createSubscriber();

        })
        Button("2、订阅事件").onClick((event: ClickEvent) => {

          this.subscribe();
          this.showDialog("订阅成功")


        })
        Button("3、取消订阅事件").onClick((event: ClickEvent) => {
          this.unsubscribe();

        })
      }
    }
    .height("100%")
    .width("100%")
    .justifyContent(FlexAlign.Center)
  }
}

6. 运行效果

7. 完整代码

Index.ets

复制代码
import { BusinessError, commonEventManager } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';

const TAG: string = 'ProcessModel';
const DOMAIN_NUMBER: number = 0xFF00;

@Entry
@ComponentV2
struct Index {
  // 【关键】将订阅者对象提升为组件成员变量,供"取消订阅"时使用
  private subscriber: commonEventManager.CommonEventSubscriber | null = null;

  // 弹窗
  showDialog(mes: string): void {
    this.getUIContext().showAlertDialog({ message: mes })
  }

  // 创建订阅
  createSubscriber(): void {
    // 订阅者信息:配置需要监听的公共事件
    let subscribeInfo: commonEventManager.CommonEventSubscribeInfo = {
      events: [
        'usual.event.POWER_CONNECTED', // 设备充电事件
        'usual.event.BATTERY_LOW',// 电池低电量事件
      ],
    };

    // 1. 创建订阅者
    commonEventManager.createSubscriber(subscribeInfo,
      (err: BusinessError, subscriber: commonEventManager.CommonEventSubscriber) => {
        if (err) {
          hilog.error(DOMAIN_NUMBER, TAG, `创建订阅者失败: ${err.message}`);
          return;
        }
        this.showDialog("创建订阅成功")
        hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in creating subscriber.');
        // 【关键】保存订阅者对象到成员变量,后续取消订阅需用到它
        this.subscriber = subscriber;
      }
    );
  }

  // 订阅事件
  subscribe(): void {
    commonEventManager.subscribe(this.subscriber, (subErr, eventData) => {
      if (subErr) {
        hilog.error(DOMAIN_NUMBER, TAG, `订阅事件失败: ${subErr.message}`);
        return;
      }

      this.showDialog(`订阅事件触发成功:${JSON.stringify(eventData)}`)
      hilog.info(DOMAIN_NUMBER, TAG, `事件触发成功!数据: ${JSON.stringify(eventData)}`);
    });
  }

  // 取消订阅事件
  unsubscribe(): void {
    if (this.subscriber !== null) {
      commonEventManager.unsubscribe(this.subscriber, (err: BusinessError) => {
        if (err) {
          hilog.error(DOMAIN_NUMBER, TAG, `取消订阅失败: ${err.message}`);
          return;
        }
        this.showDialog("取消订阅成功")
        hilog.info(DOMAIN_NUMBER, TAG, '成功取消订阅事件');
      });
    }
  }

  build() {
    Column({ space: 150 }) {
      Text("公共事件订阅示例")
        .fontSize(20)

      Column({ space: 20 }) {
        Button("1、创建订阅事件").onClick((event: ClickEvent) => {

          this.createSubscriber();

        })
        Button("2、订阅事件").onClick((event: ClickEvent) => {

          this.subscribe();
          this.showDialog("订阅成功")


        })
        Button("3、取消订阅事件").onClick((event: ClickEvent) => {
          this.unsubscribe();

        })
      }
    }
    .height("100%")
    .width("100%")
    .justifyContent(FlexAlign.Center)
  }
}

觉得有用可以点赞或收藏

相关推荐
xq95272 小时前
编程之路 2025年终总结 ,勇往直前 再战江湖
harmonyos
不爱吃糖的程序媛3 小时前
鸿蒙PC命令行开发 macOS 上解决 pkg-config 命令未安装的问题
macos·华为·harmonyos
二流小码农4 小时前
鸿蒙开发:自定义一个圆形动画菜单
android·ios·harmonyos
yumgpkpm4 小时前
Cloudera CDP7、CDH5、CDH6 在华为鲲鹏 ARM 麒麟KylinOS做到无缝切换平缓迁移过程
大数据·arm开发·华为·flink·spark·kafka·cloudera
不爱吃糖的程序媛4 小时前
解决鸿蒙PC命令行编译 macOS 上 cp 命令参数冲突问题
macos·harmonyos·策略模式
不爱吃糖的程序媛5 小时前
OpenHarmony PC 第三方 C/C++ 库适配完整指南
c语言·c++·harmonyos
不爱吃糖的程序媛5 小时前
OpenHarmony Linux 环境 SDK 使用说明(进阶--依赖库的解决方法)
linux·运维·harmonyos
狮子也疯狂5 小时前
【生态互联】| 鸿蒙三方库的选择与适配策略
华为·harmonyos
不爱吃糖的程序媛5 小时前
鸿蒙Lycium 交叉编译框架完全指南
华为·harmonyos
人间打气筒(Ada)5 小时前
[鸿蒙2025领航者闯关]星盾护航支付安全:鸿蒙6.0在金融APP中的实战闯关记
安全·金融·harmonyos·#鸿蒙2025领航者闯关#·#鸿蒙6实战#·#开发者年度总结#