找回密码
 立即注册
首页 业界区 安全 用户通知服务,轻松实现应用与用户的多场景交互 ...

用户通知服务,轻松实现应用与用户的多场景交互

套缈 2025-6-13 15:40:12
用户在使用应用时,经常想要了解应用程序在执行的操作,如下载完成、新邮件到达、发布即时的客服支付通知等,这些通知除了携带基本的文本图片信息外,最好还可以支持文件上传下载进度场景下的进度条通知,以及点击通知栏可以拉起目标应用的意图类型通知。开发者只有满足用户多种场景本地通知的需求,才能带来更好的用户体验。
HarmonyOS SDK用户通知服务(Notification Kit)为开发者提供本地通知发布通道,开发者可借助Notification Kit将应用产生的通知直接在客户端本地推送给用户,本地通知根据通知类型、用户设置及发布场景会产生对应的铃声、震动、横幅、锁屏、息屏、通知栏提醒和显示。
能力范围

Notification Kit支持的能力主要包括:
•        发布文本、进度条等类型通知。
•        携带或更新应用通知数字角标。
•        取消曾经发布的某条或全部通知。
•        查询已发布的通知列表。
•        查询应用自身通知开关状态。
•        应用通知用户的能力默认关闭,开发者可拉起授权框,请求用户授权发布通知。
1.png

业务流程

2.png

使用Notification Kit的主要业务流程如下:
1.请求用户通知授权。
2.应用发布通知到通知服务。
3.用户通过授权后,将通知展示到通知中心。
通知样式
Notification Kit中常用的通知样式如下:
3.png

开发步骤

请求通知授权


  • 导入NotificationManager模块。
  1. import { notificationManager } from '@kit.NotificationKit';
  2. import { BusinessError } from '@kit.BasicServicesKit';
  3. import { hilog } from '@kit.PerformanceAnalysisKit';
  4. import { common } from '@kit.AbilityKit';
  5. const TAG: string = '[PublishOperation]';
  6. const DOMAIN_NUMBER: number = 0xFF00;
复制代码

  • 请求通知授权。
可通过requestEnableNotification的错误码判断用户是否授权。若返回的错误码为1600004,即为拒绝授权。
  1. let context = getContext(this) as common.UIAbilityContext;
  2. notificationManager.isNotificationEnabled().then((data: boolean) => {
  3.   hilog.info(DOMAIN_NUMBER, TAG, "isNotificationEnabled success, data: " + JSON.stringify(data));
  4.   if(!data){
  5.     notificationManager.requestEnableNotification(context).then(() => {
  6.       hilog.info(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification success`);
  7.     }).catch((err : BusinessError) => {
  8.       if(1600004 == err.code){
  9.         hilog.error(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification refused, code is ${err.code}, message is ${err.message}`);
  10.       } else {
  11.         hilog.error(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification failed, code is ${err.code}, message is ${err.message}`);
  12.       }
  13.     });
  14.   }
  15. }).catch((err : BusinessError) => {
  16.     hilog.error(DOMAIN_NUMBER, TAG, `isNotificationEnabled fail, code is ${err.code}, message is ${err.message}`);
  17. });
复制代码
管理通知角标


  • 导入NotificationManager模块。
  1. import { notificationManager } from '@kit.NotificationKit';
  2. import { hilog } from '@kit.PerformanceAnalysisKit';
  3. import { BusinessError } from '@kit.BasicServicesKit';
  4. const TAG: string = '[PublishOperation]';
  5. const DOMAIN_NUMBER: number = 0xFF00;
复制代码

  • 增加角标个数。
发布通知在NotificationRequest的badgeNumber字段里携带,可参考通知发布章节。
示例为调用setBadgeNumber接口增加角标,在发布完新的通知后,调用该接口。
  1. let setBadgeNumberCallback = (err: BusinessError): void => {
  2.   if (err) {
  3.     hilog.error(DOMAIN_NUMBER, TAG, `Failed to set badge number. Code is ${err.code}, message is ${err.message}`);
  4.     return;
  5.   }
  6.   hilog.info(DOMAIN_NUMBER, TAG, `Succeeded in setting badge number.`);
  7. }
  8. let badgeNumber = 9;
  9. notificationManager.setBadgeNumber(badgeNumber, setBadgeNumberCallback);
复制代码

  • 减少角标个数。
一条通知被查看后,应用需要调用接口设置剩下未读通知个数,桌面刷新角标。
  1. let setBadgeNumberCallback = (err: BusinessError): void => {
  2.   if (err) {
  3.     hilog.error(DOMAIN_NUMBER, TAG, `Failed to set badge number. Code is ${err.code}, message is ${err.message}`);
  4.     return;
  5.   }
  6.   hilog.info(DOMAIN_NUMBER, TAG, `Succeeded in setting badge number.`);
  7. }
  8. let badgeNumber = 8;
  9. notificationManager.setBadgeNumber(badgeNumber, setBadgeNumberCallback);
复制代码
管理通知渠道


  • 导入notificationManager模块。
  1. import { notificationManager } from '@kit.NotificationKit';
  2. import { BusinessError } from '@kit.BasicServicesKit';
  3. import { hilog } from '@kit.PerformanceAnalysisKit';
  4. const TAG: string = '[PublishOperation]';
  5. const DOMAIN_NUMBER: number = 0xFF00;
复制代码

  • 创建指定类型的通知渠道。
  1. // addslot回调
  2. let addSlotCallBack = (err: BusinessError): void => {
  3.   if (err) {
  4.     hilog.info(DOMAIN_NUMBER, TAG, `addSlot failed, code is ${err.code}, message is ${err.message}`);
  5.   } else {
  6.     hilog.info(DOMAIN_NUMBER, TAG, `addSlot success`);
  7.   }
  8. }
  9. notificationManager.addSlot(notificationManager.SlotType.SOCIAL_COMMUNICATION, addSlotCallBack);
复制代码

  • 查询指定类型的通知渠道。
获取对应渠道是否创建以及该渠道支持的通知提醒方式,比如是否有声音提示,是否有震动,锁屏是否可见等。
  1. // getSlot回调
  2. let getSlotCallback = (err: BusinessError, data: notificationManager.NotificationSlot): void => {
  3.   if (err) {
  4.     hilog.error(DOMAIN_NUMBER, TAG, `getSlot failed, code is ${JSON.stringify(err.code)}, message is ${JSON.stringify(err.message)}`);
  5.   } else {
  6.     hilog.info(DOMAIN_NUMBER, TAG, `getSlot success. `);
  7.     if (data != null) {
  8.       hilog.info(DOMAIN_NUMBER, TAG, `slot enable status is ${JSON.stringify(data.enabled)}`);
  9.       hilog.info(DOMAIN_NUMBER, TAG, `slot level is ${JSON.stringify(data.level)}`);
  10.       hilog.info(DOMAIN_NUMBER, TAG, `vibrationEnabled status is ${JSON.stringify(data.vibrationEnabled)}`);
  11.       hilog.info(DOMAIN_NUMBER, TAG, `lightEnabled status is ${JSON.stringify(data.lightEnabled)}`);
  12.     }
  13.   }
  14. }
  15. let slotType: notificationManager.SlotType = notificationManager.SlotType.SOCIAL_COMMUNICATION;
  16. notificationManager.getSlot(slotType, getSlotCallback);
复制代码

  • 删除指定类型的通知渠道。
  1. // removeSlot回调
  2. let removeSlotCallback = (err: BusinessError): void => {
  3.   if (err) {
  4.     hilog.error(DOMAIN_NUMBER, TAG, `removeSlot failed, code is ${JSON.stringify(err.code)}, message is ${JSON.stringify(err.message)}`);
  5.   } else {
  6.     hilog.info(DOMAIN_NUMBER, TAG, "removeSlot success");
  7.   }
  8. }
  9. let slotType: notificationManager.SlotType = notificationManager.SlotType.SOCIAL_COMMUNICATION;
  10. notificationManager.removeSlot(slotType, removeSlotCallback);
复制代码
发布通知

发布文本类型通知


  • 导入模块。
  1. import { notificationManager } from '@kit.NotificationKit';
  2. import { BusinessError } from '@kit.BasicServicesKit';
  3. import { hilog } from '@kit.PerformanceAnalysisKit';
  4. const TAG: string = '[PublishOperation]';
  5. const DOMAIN_NUMBER: number = 0xFF00;
复制代码

  • 构造NotificationRequest对象,并发布通知。
普通文本类型通知由标题、文本内容和附加信息三个字段组成,其中标题和文本内容是必填字段,大小均需要小于200字节,超出部分会被截断。
  1. let notificationRequest: notificationManager.NotificationRequest = {
  2.   id: 1,
  3.   content: {
  4.     notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, // 普通文本类型通知
  5.     normal: {
  6.       title: 'test_title',
  7.       text: 'test_text',
  8.       additionalText: 'test_additionalText',
  9.     }
  10.   }
  11. };
  12. notificationManager.publish(notificationRequest, (err: BusinessError) => {
  13.   if (err) {
  14.     hilog.error(DOMAIN_NUMBER, TAG, `Failed to publish notification. Code is ${err.code}, message is ${err.message}`);
  15.     return;
  16.   }
  17.   hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in publishing notification.');
  18. });
复制代码
多行文本类型通知继承了普通文本类型的字段,同时新增了多行文本内容、内容概要和通知展开时的标题,其字段均小于200字节,超出部分会被截断。通知默认显示与普通文本相同,展开后,标题显示为展开后标题内容,多行文本内容多行显示。
  1. let notificationRequest: notificationManager.NotificationRequest = {
  2.   id: 3,
  3.   content: {
  4.     notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_MULTILINE, // 多行文本类型通知
  5.     multiLine: {
  6.       title: 'test_title',
  7.       text: 'test_text',
  8.       briefText: 'test_briefText',
  9.       longTitle: 'test_longTitle',
  10.       lines: ['line_01', 'line_02', 'line_03', 'line_04'],
  11.     }
  12.   }
  13. };
  14. // 发布通知
  15. notificationManager.publish(notificationRequest, (err: BusinessError) => {
  16.   if (err) {
  17.     hilog.error(DOMAIN_NUMBER, TAG, `Failed to publish notification. Code is ${err.code}, message is ${err.message}`);
  18.     return;
  19.   }
  20.   hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in publishing notification.');
  21. });
复制代码
发布进度条类型通知


  • 导入模块。
  1. import { notificationManager } from '@kit.NotificationKit';
  2. import { BusinessError } from '@kit.BasicServicesKit';
  3. import { hilog } from '@kit.PerformanceAnalysisKit';
  4. const TAG: string = '[PublishOperation]';
  5. const DOMAIN_NUMBER: number = 0xFF00;
复制代码

  • 查询系统是否支持进度条模板,查询结果为支持downloadTemplate模板类通知。
  1. notificationManager.isSupportTemplate('downloadTemplate').then((data:boolean) => {
  2.   hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in supporting download template notification.');
  3.   let isSupportTpl: boolean = data; // isSupportTpl的值为true表示支持downloadTemplate模板类通知,false表示不支持
  4. }).catch((err: BusinessError) => {
  5.   hilog.error(DOMAIN_NUMBER, TAG, `Failed to support download template notification. Code is ${err.code}, message is ${err.message}`);
  6. });
复制代码

  • 构造进度条模板对象,并发布通知。
  1. let notificationRequest: notificationManager.NotificationRequest = {
  2.   id: 5,
  3.   content: {
  4.     notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
  5.     normal: {
  6.       title: 'test_title',
  7.       text: 'test_text',
  8.       additionalText: 'test_additionalText'
  9.     }
  10.   },
  11.   // 构造进度条模板,name字段当前需要固定配置为downloadTemplate
  12.   template: {
  13.     name: 'downloadTemplate',
  14.     data: { title: 'File Title', fileName: 'music.mp4', progressValue: 45 }
  15.   }
  16. }
  17. // 发布通知
  18. notificationManager.publish(notificationRequest, (err: BusinessError) => {
  19.   if (err) {
  20.     hilog.error(DOMAIN_NUMBER, TAG, `Failed to publish notification. Code is ${err.code}, message is ${err.message}`);
  21.     return;
  22.   }
  23.   hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in publishing notification.');
  24. });
复制代码
为通知添加行为意图


  • 导入模块。
  1. import { notificationManager } from '@kit.NotificationKit';
  2. import { wantAgent, WantAgent } from '@kit.AbilityKit';
  3. import { BusinessError } from '@kit.BasicServicesKit';
  4. import { hilog } from '@kit.PerformanceAnalysisKit';
  5. const TAG: string = '[PublishOperation]';
  6. const DOMAIN_NUMBER: number = 0xFF00;
复制代码

  • 创建WantAgentInfo信息。
场景一:创建拉起UIAbility的WantAgent的WantAgentInfo信息。
let wantAgentObj:WantAgent; // 用于保存创建成功的wantAgent对象,后续使用其完成触发的动作。
  1. // 通过WantAgentInfo的operationType设置动作类型
  2. let wantAgentInfo:wantAgent.WantAgentInfo = {
  3.   wants: [
  4.     {
  5.       deviceId: '',
  6.       bundleName: 'com.samples.notification',
  7.       abilityName: 'SecondAbility',
  8.       action: '',
  9.       entities: [],
  10.       uri: '',
  11.       parameters: {}
  12.     }
  13.   ],
  14.   actionType: wantAgent.OperationType.START_ABILITY,
  15.   requestCode: 0,
  16.   wantAgentFlags:[wantAgent.WantAgentFlags.CONSTANT_FLAG]
  17. };
复制代码
场景二:创建发布公共事件的WantAgent的WantAgentInfo信息。
let wantAgentObj:WantAgent; // 用于保存创建成功的WantAgent对象,后续使用其完成触发的动作。
  1. // 通过WantAgentInfo的operationType设置动作类型
  2. let wantAgentInfo:wantAgent.WantAgentInfo = {
  3.   wants: [
  4.     {
  5.       action: 'event_name', // 设置事件名
  6.       parameters: {},
  7.     }
  8.   ],
  9.   actionType: wantAgent.OperationType.SEND_COMMON_EVENT,
  10.   requestCode: 0,
  11.   wantAgentFlags: [wantAgent.WantAgentFlags.CONSTANT_FLAG],
  12. };
复制代码

  • 调用getWantAgent()方法进行创建WantAgent。
  1. // 创建WantAgent
  2. wantAgent.getWantAgent(wantAgentInfo, (err: BusinessError, data:WantAgent) => {
  3.   if (err) {
  4.     hilog.error(DOMAIN_NUMBER, TAG, `Failed to get want agent. Code is ${err.code}, message is ${err.message}`);
  5.     return;
  6.   }
  7.   hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in getting want agent.');
  8.   wantAgentObj = data;
  9. });
复制代码

  • 构造NotificationRequest对象,并发布WantAgent通知。
  1. // 构造NotificationRequest对象
  2. let notificationRequest: notificationManager.NotificationRequest = {
  3.   content: {
  4.     notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
  5.     normal: {
  6.       title: 'Test_Title',
  7.       text: 'Test_Text',
  8.       additionalText: 'Test_AdditionalText',
  9.     },
  10.   },
  11.   id: 6,
  12.   label: 'TEST',
  13.   // wantAgentObj使用前需要保证已被赋值(即步骤3执行完成)
  14.   wantAgent: wantAgentObj,
  15. }
  16. notificationManager.publish(notificationRequest, (err: BusinessError) => {
  17.   if (err) {
  18.     hilog.error(DOMAIN_NUMBER, TAG, `Failed to publish notification. Code is ${err.code}, message is ${err.message}`);
  19.     return;
  20.   }
  21.   hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in publishing notification.');
  22. });
复制代码

  • 用户通过点击通知栏上的通知,系统会自动触发WantAgent的动作。
了解更多详情>>
获取用户通知服务开发指导文档

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册