Skip to content

动态订阅公共事件

场景介绍

动态订阅是指当应用在运行状态时对某个公共事件进行订阅,在运行期间如果有订阅的事件发布那么订阅了这个事件的应用将会收到该事件及其传递的参数。例如,某应用希望在其运行期间收到电量过低的事件,并根据该事件降低其运行功耗,那么该应用便可动态订阅电量过低事件,收到该事件后关闭一些非必要的任务来降低功耗。订阅部分系统公共事件需要先申请权限,订阅这些事件所需要的权限请见公共事件权限列表

接口说明

  • 创建订阅者对象有回调函数
bash

createSubscriber(subscribeInfo: CommonEventSubscribeInfo, callback: AsyncCallback<CommonEventSubscriber>): void
  • 创建订阅者对象无回调
bash

createSubscriber(subscribeInfo: CommonEventSubscribeInfo): Promise<CommonEventSubscriber>
  • 订阅公共事件
bash
subscribe(subscriber: CommonEventSubscriber, callback: AsyncCallback): void

开发步骤

导入模块

js
import { BusinessError, commonEventManager } from "@kit.BasicServicesKit";
import { promptAction } from "@kit.ArkUI";
import { hilog } from "@kit.PerformanceAnalysisKit";

const TAG: string = "ProcessModel";
const DOMAIN_NUMBER: number = 0xff00;

创建订阅者信息

js
// 用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作
let subscriber: commonEventManager.CommonEventSubscriber | null = null;
// 订阅者信息,其中的event字段需要替换为实际的事件名称。
let subscribeInfo: commonEventManager.CommonEventSubscribeInfo = {
  events: ["event"], //接受指定的事件名,可以为多个
};

创建订阅者

  • 保存返回的订阅者对象 subscriber,用于执行后续的订阅,退订
js
// 创建订阅者回调
commonEventManager.createSubscriber(
  subscribeInfo,
  (err: BusinessError, data: commonEventManager.CommonEventSubscriber) => {
    if (err) {
      hilog.error(
        DOMAIN_NUMBER,
        TAG,
        `Failed to create subscriber. Code is ${err.code}, message is ${err.message}`
      );
      return;
    }
    hilog.info(DOMAIN_NUMBER, TAG, "Succeeded in creating subscriber.");
    subscriber = data;
  }
);

4.创建订阅回调函数

订阅回调函数会在接收到事件时触发。订阅回调函数返回的 data 内包含了公共事件的名称、发布者携带的数据等信息

js
// 订阅公共事件回调
if (subscriber !== null) {
  commonEventManager.subscribe(
    subscriber,
    (err: BusinessError, data: commonEventManager.CommonEventData) => {
      if (err) {
        hilog.error(
          DOMAIN_NUMBER,
          TAG,
          `Failed to subscribe common event. Code is ${err.code}, message is ${err.message}`
        );
        return;
      }
      // ...
    }
  );
} else {
  hilog.error(DOMAIN_NUMBER, TAG, `Need create subscriber`);
}