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

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

觉得有用可以点赞或收藏

相关推荐
讯方洋哥18 小时前
HarmonyOS App开发——职前通应用App开发(下)
华为·harmonyos
摘星编程20 小时前
React Native鸿蒙版:Image图片占位符
react native·react.js·harmonyos
大雷神21 小时前
HarmonyOS智慧农业管理应用开发教程--高高种地-- 第30篇:设置与帮助系统
harmonyos
Swift社区1 天前
HarmonyOS 自定义组件与布局实践
华为·harmonyos
鸿蒙开发工程师—阿辉1 天前
让 AI 帮你编译部署鸿蒙应用:harmonyos-build-deploy Skill
华为·harmonyos
盐焗西兰花1 天前
鸿蒙学习实战之路-Reader Kit构建阅读器最佳实践
学习·华为·harmonyos
一起养小猫1 天前
Flutter for OpenHarmony 实战:记忆棋游戏完整开发指南
flutter·游戏·harmonyos
飞羽殇情1 天前
基于React Native鸿蒙跨平台开发构建完整电商预售系统数据模型,完成参与预售、支付尾款、商品信息展示等
react native·react.js·华为·harmonyos
Betelgeuse761 天前
【Flutter For OpenHarmony】TechHub技术资讯界面开发
flutter·ui·华为·交互·harmonyos
国服第二切图仔1 天前
openJiuwen智能体平台部署搭建及政务通助手工作流智能体开发实战
华为·政务·智能体