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

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)
  }
}

觉得有用可以点赞或收藏

相关推荐
星释19 小时前
鸿蒙Flutter三方库适配指南:09.版本升级适配
flutter·华为·harmonyos
电化学仪器白超1 天前
④使用 PPTSYNC.exe 与华为手机拍照制作 GIF 动画
服务器·华为·智能手机
CN-cheng1 天前
Flutter项目在HarmonyOS(鸿蒙)运行报错问题总结
flutter·华为·harmonyos·flutter运行到鸿蒙
平平不平凡1 天前
鸿蒙音频播放器深度解析:从核心设计到完整实现
harmonyos
HMSCore1 天前
【FAQ】HarmonyOS SDK 闭源开放能力 — Form Kit
harmonyos
小Mei数码说1 天前
华为WATCH D2 & WATCH GT6:秋季来临,尊爱老人的智能守护
华为
极客范儿1 天前
华为HCIP网络工程师认证—网络参考模型
网络·华为
摘星编程1 天前
昇腾NPU性能调优实战:INT8+批处理优化Mistral-7B全记录
人工智能·华为·gitcode·昇腾
爱笑的眼睛112 天前
HarmonyOS数据存储Kit深度实践:从架构设计到性能优化
华为·harmonyos
爱笑的眼睛112 天前
HarmonyOS后台代理提醒Agent:构建智能提醒功能的深度解析
华为·harmonyos