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

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

觉得有用可以点赞或收藏

相关推荐
o***Y36313 小时前
鸿蒙NEXT(五):鸿蒙版React Native架构浅析
react native·架构·harmonyos
lqj_本人13 小时前
混合应用落地:用 OpenHarmony + Cordova 封装 Web 2048 游戏
harmonyos
D***t13113 小时前
HarmonyOS在智能家居中的华为生态
华为·智能家居·harmonyos
b***748813 小时前
HarmonyOS在智能家居中的语音助手
华为·智能家居·harmonyos
u***j32414 小时前
HarmonyOS分布式能力核心技术深度解析
分布式·华为·harmonyos
7***n7514 小时前
HarmonyOS分布式数据管理
分布式·华为·harmonyos
S***y39615 小时前
HarmonyOS在智能家居中的情景模式
华为·智能家居·harmonyos
IT充电站15 小时前
HarmonyOS 帧动画 animator
harmonyos
IT充电站15 小时前
HarmonyOS 位置服务全攻略:精准定位、地理编码与后台持续定位实现
harmonyos
IT充电站15 小时前
HarmonyOS 组件导航(Navigation)
harmonyos