【HarmonyOS NEXT】FAQ之应用服务开发(用户通知服务)

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

更多详情查看:文档中心

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值