1、如何封装一个通用的commonEvent工具类
A:通过commonEventManager模块实现,具体可参考如下代码:
import { commonEventManager , BusinessError } from '@kit.BasicServicesKit'; export class SubscribeEvent { private static subscriber: commonEventManager.CommonEventSubscriber // 自定义的回调函数变量 private static callback: (a: BusinessError, b: commonEventManager.CommonEventSubscriber) => void /** * 创建订阅者 * @param subscribeInfo 订阅事件 * @callback 用户自定义回调函数 */ static createSubscriber(subscribeInfo: commonEventManager.CommonEventSubscribeInfo, callback: (err: BusinessError, commonEventSubscriber: commonEventManager.CommonEventSubscriber) => void) { SubscribeEvent.callback = callback commonEventManager.createSubscriber(subscribeInfo, (err: BusinessError, subscriber) => { if (err) { console.error('CreateSubscriberCallBack err = ' + JSON.stringify(err)) } else { SubscribeEvent.subscriber = subscriber; SubscribeEvent.subscribe(subscriber) console.info('Create subscriber succeed') } }) } /** * 订阅公共事件 * @param subscriber 订阅者 */ private static subscribe(subscriber: commonEventManager.CommonEventSubscriber) { if (subscriber != null) { commonEventManager.subscribe(subscriber, (err: BusinessError, data) => { if (err) { console.error('subscribe err = ' + JSON.stringify(err)) } else { console.info('SubscribeCallBack data= ' + JSON.stringify(data)) // this.callback('hello callback', data) } }) } else { console.info("Need create subscriber") } } } @Entry @Component struct Faq10_1 { @State message: string = '' // 发布公共事件回调 publishCB(err: BusinessError) { if (err) { console.error(`publish failed, code is ${err.code}, message is ${err.message}`); } else { console.info("publish") ; } } build() { Row() { Column() { Text('订阅:' + this.message) .fontSize(30) .fontWeight(FontWeight.Bold) .onClick(() => { let subscribeInfo: commonEventManager.CommonEventSubscribeInfo = { events: ["myEvent"] }; let callback = (a: BusinessError, b: commonEventManager.CommonEventSubscriber) => { this.message = a.name } SubscribeEvent.createSubscriber(subscribeInfo, callback) }) Text('发布') .fontSize(30) .fontWeight(FontWeight.Bold) .onClick(() => { // 公共事件相关信息 let options: commonEventManager.CommonEventPublishData = { code: 0, // 公共事件的初始代码 data: "initial data", // 公共事件的初始数据 isOrdered: true // 有序公共事件 } // 发布公共事件 try { commonEventManager.publish("myEvent", options, this.publishCB); } catch (err) { console.error(`publish failed, code is ${err.code}, message is ${err.message}`); } }) } .width('100%') } .height('100%') } }
2、如何让事件只在一个UIAbility实例中传递
A:在UIAbility中使用EventHub订阅事件,EventHub模块提供了事件中心,提供订阅、取消订阅、触发事件的能力。
参考代码如下:
import { UIAbility } from '@kit.AbilityKit'; export default class EntryAbility extends UIAbility { onForeground() { this.context.eventHub.on('myEvent', this.eventFunc); // 结果: // eventFunc is called,undefined,undefined this.context.eventHub.emit('myEvent'); // 结果: // eventFunc is called,1,undefined this.context.eventHub.emit('myEvent', 1); // 结果: // eventFunc is called,1,2 this.context.eventHub.emit('myEvent', 1, 2); } eventFunc(argOne: number, argTwo: number) { console.log('eventFunc is called, ${argOne}, ${argTwo}'); } }
3、如何实现点击Notification通知打开App功能
A:通过配置notificationManager.publish发布通知接口的参数NotificationRequest中wantAgent属性实现,可参考如下示例:
import { notificationManager } from '@kit.NotificationKit'; import { wantAgent } from '@kit.AbilityKit'; async function publishNotification() { let wantAgentInfo: wantAgent.WantAgentInfo = { wants: [ { bundleName: "com.example.webuseragent", // 自己应用的bundleName abilityName: "EntryAbility", } ], operationType: wantAgent.OperationType.START_ABILITIES, requestCode: 1, } const wantAgentObj = await wantAgent.getWantAgent(wantAgentInfo) let contentType = notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT; await notificationManager.publish({ content: { contentType: contentType, normal: { title: "测试标题", text: "测试内容", } }, id: 1, wantAgent: wantAgentObj }) }
4、如何创建带按钮通知
A:可通过设置NotificationRequest中actionButtons设置通知按钮,最多可设置三个按钮。
参考代码如下:
import { BusinessError } from '@kit.BasicServicesKit'; import { notificationManager } from '@kit.NotificationKit'; import { wantAgent , WantAgent } from '@kit.AbilityKit'; // publish回调 let publishCallback = (err: BusinessError): void => { if (err) { console.error(`publish failed, code is ${err.code}, message is ${err.message}`); } else { console.info("publish success"); } } let wantAgentObj:WantAgent; // 用于保存创建成功的WantAgent对象,后续使用其完成触发的动作。 // 通过WantAgentInfo的operationType设置动作类型 let wantAgentInfo:wantAgent.WantAgentInfo = { wants: [ { action: 'event_name', // 设置事件名 parameters: {}, } ], operationType: wantAgent.OperationType.SEND_COMMON_EVENT, requestCode: 0, wantAgentFlags: [wantAgent.WantAgentFlags.CONSTANT_FLAG], }; // 通知Request对象 let notificationRequest: notificationManager.NotificationRequest = { id: 1, content: { contentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, normal: { title: "test_title", text: "test_text", additionalText: "test_additionalText" } }, actionButtons: [ { title: '回复', wantAgent: wantAgentObj } ] }; notificationManager.publish(notificationRequest, publishCallback);
5、如何监听系统公共事件,如熄屏、亮屏、开机等
A:通过CES(Common Event Service,公共事件服务)为应用程序提供订阅、发布、退订公共事件的能力。可以通过订阅系统公共事件监听熄屏和亮屏。另外开机事件可使用公共事件“COMMON_EVENT_BOOT_COMPLETED“来监听。
参考代码如下:
import { commonEventManager } from '@kit.BasicServicesKit'; let subscriber:commonEventManager.CommonEventSubscriber; let subscribeInfo: commonEventManager.CommonEventSubscribeInfo = { events: ['usual.event.SCREEN_OFF'], // 订阅灭屏公共事件 priority:80 } commonEventManager.createSubscriber(subscribeInfo, (err, data) => { if (err) { console.error(`Failed to create subscriber. Code is ${err.code}, message is ${err.message}`); return; } console.info('Succeeded in creating subscriber1.'); subscriber = data; // 订阅公共事件回调 commonEventManager.subscribe(subscriber, (err, data) => { if (err) { console.error(`Failed to subscribe common event. Code is ${err.code}, message is ${err.message}`); return; } else { console.info(`Succeeded in subscribe common event Succeeded1 `); } }) })
6、requestEnableNotification接口申请通知权限的机制是怎样的
A:
requestEnableNotification首次执行时,会直接弹出通知权限的申请弹窗,且该接口的回调函数与用户是否授权无关。
requestEnableNotification非首次执行时,不会弹出通知权限的申请弹窗,且无论是否拥有通知权限,都会直接返回success。
7、系统弹框和应用消息推送的区别是什么
A:
-
系统弹框是指操作系统在特定情况下会弹出的提示框,例如电脑端的系统更新提示、手机端的电量低提示等。系统弹框通常是由操作系统自己控制和展示的,应用程序无法主动触发或控制。
-
应用消息推送则是指应用程序在后台发送的消息通知,可以显示在手机的通知栏或电脑的任务栏等位置,例如社交媒体应用的新消息提醒、邮件应用的邮件到达提醒等。应用消息推送需要应用程序自己发送,用户可以根据自己的需要设置是否接收这些通知。
8、调用notificationManager.publish发布通知失败
A:发布通知时,需要在真机端系统设置中,开启对应应用的通知开关,然后才能在通知栏中看到发布的通知。
-
手动开启步骤:设置 > 通知和状态栏 > 应用名称 > 允许通知。
-
也可通过接口notificationManager.requestEnableNotification()来弹窗让用户授权(仅弹一次)。
9、emitter.off取消订阅某个事件后,是不是所有订阅该事件的地方都不会再收到该事件的消息
A:是的,emitter.off取消订阅某个事件后,所有订阅这个事件的地方都不会再收到这个事件的消息。
参考代码如下:
// 取消eventID为1的所有事件回调处理函数 emitter.off(1);
更多详情查看:文档中心