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

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

觉得有用可以点赞或收藏

相关推荐
我是华为OD~HR~栗栗呀4 小时前
华为od-21届考研-C++面经
java·c语言·c++·python·华为od·华为·面试
安防视频中间件/视频资源汇聚平台5 小时前
华为结构化摄像机接入到SVMSPro平台操作流程
华为·信息可视化·实时音视频·svmspro
颜颜yan_7 小时前
HarmonyOS 6 ArkUI框架实战:文本展开折叠组件开发详解
华为·harmonyos·arkui
Industio_触觉智能8 小时前
开源鸿蒙6.1和8.1版本被确定为LTS建议版本,最新路标正式发布!-转自开源鸿蒙OpenHarmony社区
harmonyos·openharmony·开源鸿蒙
●VON10 小时前
重生之我在大学自学鸿蒙开发第五天-《实战篇》
学习·华为·云原生·harmonyos·鸿蒙
饮马长城窟10 小时前
华为Asend NPU 大模型W8A8量化调优
华为
文火冰糖的硅基工坊11 小时前
[嵌入式系统-114]:华为的操作系统:鸿蒙操作系统(HarmonyOS)和欧拉操作系统(openEuler)
科技·华为·架构·harmonyos
岸芷漫步12 小时前
鸿蒙应用中的页面跳转分析
harmonyos
大雷神12 小时前
windows开发中使用flutter开发鸿蒙
华为·harmonyos