1# 动态订阅公共事件 2 3<!--Kit: Basic Services Kit--> 4<!--Subsystem: Notification--> 5<!--Owner: @peixu--> 6<!--Designer: @dongqingran; @wulong158--> 7<!--Tester: @wanghong1997--> 8<!--Adviser: @huipeizi--> 9 10## 场景介绍 11 12动态订阅是指当应用在运行状态时对某个公共事件进行订阅,在运行期间如果有订阅的事件发布那么订阅了这个事件的应用将会收到该事件及其传递的参数。 13 14例如,某应用希望在其运行期间收到电量过低的事件,并根据该事件降低其运行功耗,那么该应用便可动态订阅电量过低事件,收到该事件后关闭一些非必要的任务来降低功耗。 15 16订阅部分系统公共事件需要先[申请权限](../../security/AccessToken/determine-application-mode.md),订阅这些事件所需要的权限请见[公共事件权限列表](../../reference/apis-basic-services-kit/common_event/commonEventManager-definitions.md)。 17 18> **说明:** 19> 20> 订阅者对象的生命周期需要接入方管理,不再使用时需主动销毁释放,避免内存泄漏。 21> 22> 动态订阅的公共事件回调受应用状态影响。当应用处于后台时,无法接收到动态订阅公共事件。当应用从后台切换到前台时,最多可以回调切回前30s内监听的公共事件。 23 24## 接口说明 25 26详细接口见[接口文档](../../reference/apis-basic-services-kit/js-apis-commonEventManager.md)。 27 28| 接口名 | 接口描述 | 29| -------- | -------- | 30| [createSubscriber](../../reference/apis-basic-services-kit/js-apis-commonEventManager.md#commoneventmanagercreatesubscriber)(subscribeInfo: CommonEventSubscribeInfo, callback: AsyncCallback<CommonEventSubscriber>): void | 创建订阅者对象(callback)。 | 31| [createSubscriber](../../reference/apis-basic-services-kit/js-apis-commonEventManager.md#commoneventmanagercreatesubscriber-1)(subscribeInfo: CommonEventSubscribeInfo): Promise<CommonEventSubscriber> | 创建订阅者对象(promise)。 | 32| [subscribe](../../reference/apis-basic-services-kit/js-apis-commonEventManager.md#commoneventmanagersubscribe)(subscriber: CommonEventSubscriber, callback: AsyncCallback<CommonEventData>): void | 订阅公共事件。 | 33 34 35## 开发步骤 36 371. 导入模块。 38 39 ```ts 40 import { BusinessError, commonEventManager } from '@kit.BasicServicesKit'; 41 import { hilog } from '@kit.PerformanceAnalysisKit'; 42 43 const TAG: string = 'ProcessModel'; 44 const DOMAIN_NUMBER: number = 0xFF00; 45 ``` 46 472. 创建订阅者信息,详细的订阅者信息数据类型及包含的参数请见[CommonEventSubscribeInfo](../../reference/apis-basic-services-kit/js-apis-inner-commonEvent-commonEventSubscribeInfo.md)文档介绍。 48 49 ```ts 50 // 用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 51 let subscriber: commonEventManager.CommonEventSubscriber | null = null; 52 // 订阅者信息,其中的event字段需要替换为实际的事件名称。 53 let subscribeInfo: commonEventManager.CommonEventSubscribeInfo = { 54 events: ['event'], // 订阅灭屏公共事件 55 }; 56 ``` 57 583. 创建订阅者,保存返回的订阅者对象subscriber,用于执行后续的订阅、退订、接收事件回调等操作。 59 60 ```ts 61 // 创建订阅者回调 62 commonEventManager.createSubscriber(subscribeInfo, (err: BusinessError, data: commonEventManager.CommonEventSubscriber) => { 63 if (err) { 64 hilog.error(DOMAIN_NUMBER, TAG, `Failed to create subscriber. Code is ${err.code}, message is ${err.message}`); 65 return; 66 } 67 hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in creating subscriber.'); 68 subscriber = data; 69 }) 70 ``` 71 724. 创建订阅回调函数,订阅回调函数会在接收到事件时触发。订阅回调函数返回的data内包含了公共事件的名称、发布者携带的数据等信息,公共事件数据的详细参数和数据类型请见[CommonEventData](../../reference/apis-basic-services-kit/js-apis-inner-commonEvent-commonEventData.md)文档介绍。 73 74 ```ts 75 // 订阅公共事件回调 76 if (subscriber !== null) { 77 commonEventManager.subscribe(subscriber, (err: BusinessError, data: commonEventManager.CommonEventData) => { 78 if (err) { 79 hilog.error(DOMAIN_NUMBER, TAG, `Failed to subscribe common event. Code is ${err.code}, message is ${err.message}`); 80 return; 81 } 82 console.info(`Succeeded in subscribing, data is ${JSON.stringify(data)}`); 83 }) 84 } else { 85 hilog.error(DOMAIN_NUMBER, TAG, `Need create subscriber`); 86 } 87 ``` 88 89<!--RP1--> 90<!--RP1End-->