写点什么

鸿蒙 NEXT 开发 - 用户通知服务

作者:东林知识库
  • 2025-03-31
    江苏
  • 本文字数:6287 字

    阅读完需:约 21 分钟

1. 用户通知服务基本介绍

Notification Kit(用户通知服务)为开发者提供本地通知发布通道,开发者可借助 Notification Kit 将应用产生的通知直接在客户端本地推送给用户,本地通知根据通知类型及发布场景会产生对应的铃声、震动、横幅、锁屏、息屏、通知栏提醒和显示。

2. 能力范围

Notification Kit 支持的能力主要包括:


  • 发布文本、进度条等类型通知。

  • 携带或更新应用通知数字角标。

  • 取消曾经发布的某条或全部通知。

  • 查询已发布的通知列表。

  • 查询应用自身通知开关状态。

  • 应用通知用户的能力默认关闭,开发者可拉起授权框,请求用户授权发布通知。



编辑

3. 业务流程


编辑


使用 Notification Kit 的主要业务流程如下:


1.请求通知授权。


2.应用发布通知到通知服务。


3.将通知展示到通知中心。


Notification Kit 中常用的通知样式如下:



编辑


注意:


  • 单个应用已发布的通知在通知中心等系统入口的留存数量有限(当前规格最多 24 条)。

  • 通知的长度不能超过 200KB(跨进程序列化大小限制)。

  • 系统所有应用发布新通知的频次累计不能超过每秒 10 条,更新通知的频次累计不能超过每秒 20 条。


官方文档地址:文档中心

4. 用户通知服务-基础通知

4.1 基本介绍

文本类型通知主要应用于发送短信息、提示信息等,支持普通文本类型和多行文本类型。

4.2 接口方法

4.3 代码示例

import { notificationManager } from '@kit.NotificationKit';import { BusinessError } from '@kit.BasicServicesKit';import { hilog } from '@kit.PerformanceAnalysisKit';import { common } from '@kit.AbilityKit';
// 日志标识const TAG: string = '[publishTest]';const DOMAIN_NUMBER: number = 0xFF00;let context = getContext(this) as common.UIAbilityContext;
@Entry@Componentstruct Index { /** * 请求通知授权 */ aboutToAppear(): void { notificationManager.isNotificationEnabled().then((data: boolean) => { hilog.info(DOMAIN_NUMBER, TAG, "isNotificationEnabled success, data: " + JSON.stringify(data)); if (!data) { notificationManager.requestEnableNotification(context).then(() => { hilog.info(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification success`); }).catch((err: BusinessError) => { if (1600004 == err.code) { hilog.error(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification refused, code is ${err.code}, message is ${err.message}`); } else { hilog.error(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification failed, code is ${err.code}, message is ${err.message}`); } }); } }).catch((err: BusinessError) => { hilog.error(DOMAIN_NUMBER, TAG, `isNotificationEnabled fail, code is ${err.code}, message is ${err.message}`); }); }
/** * 通知方法 */ publish() { let notificationRequest: notificationManager.NotificationRequest = { // 通知的唯一id id: 1, content: { notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, // 普通文本类型通知 normal: { // 通知的标题 title: '百得知识库', // 通知的内容 text: '百得知识库提醒你该学习了', // 附加消息 additionalText: '百得', } } }; notificationManager.publish(notificationRequest, (err: BusinessError) => { if (err) { hilog.error(DOMAIN_NUMBER, TAG, `Failed to publish notification. Code is ${err.code}, message is ${err.message}`); return; } hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in publishing notification.'); }); }
/** * 取消指定的通知 */ cancelPublish() { notificationManager.cancel(1, (err: BusinessError) => { if (err) { hilog.error(DOMAIN_NUMBER, TAG, `Failed to cancel notification. Code is ${err.code}, message is ${err.message}`); return; } hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in cancel notification.'); }); }
build() { Column({ space: 20 }) {
Button('发布文本类型通知') .onClick(() => { this.publish() })
Button('取消通知') .onClick(() => { this.cancelPublish() })
} .height('100%') .width('100%') .justifyContent(FlexAlign.Center) }}
复制代码



编辑



编辑

5. 用户通知服务-进度条通知

5.1 基本介绍

进度条通知也是常见的通知类型,主要应用于文件下载、事务处理进度显示。当前系统提供了进度条模板,发布通知应用设置好进度条模板的属性值,如模板名、模板数据,通过通知子系统发送到通知栏显示。

5.2 接口方法

5.3 代码示例

import { notificationManager } from '@kit.NotificationKit';import { BusinessError } from '@kit.BasicServicesKit';import { hilog } from '@kit.PerformanceAnalysisKit';import { promptAction } from '@kit.ArkUI';import { common } from '@kit.AbilityKit';
const TAG: string = '[publishTest]';const DOMAIN_NUMBER: number = 0xFF00;let context = getContext(this) as common.UIAbilityContext;
@Entry @Component struct Page { /** * 请求通知授权 */ aboutToAppear(): void { notificationManager.isNotificationEnabled().then((data: boolean) => { hilog.info(DOMAIN_NUMBER, TAG, "isNotificationEnabled success, data: " + JSON.stringify(data)); if (!data) { notificationManager.requestEnableNotification(context).then(() => { hilog.info(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification success`); }).catch((err: BusinessError) => { if (1600004 == err.code) { hilog.error(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification refused, code is ${err.code}, message is ${err.message}`); } else { hilog.error(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification failed, code is ${err.code}, message is ${err.message}`); } }); } }).catch((err: BusinessError) => { hilog.error(DOMAIN_NUMBER, TAG, `isNotificationEnabled fail, code is ${err.code}, message is ${err.message}`); }); }
/** * 发布通知 */ publish() { // 查询系统是否支持进度条模板 notificationManager.isSupportTemplate('downloadTemplate').then((data: boolean) => { hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in supporting download template notification.'); let isSupportTpl: boolean = data; // isSupportTpl的值为true表示支持downloadTemplate模板类通知,false表示不支持 if (isSupportTpl) { let notificationRequest: notificationManager.NotificationRequest = { id: 1, content: { notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, normal: { title: '东林视频', text: '东林视频下载', additionalText: '东林' } }, // 构造进度条模板,name字段当前需要固定配置为downloadTemplate template: { name: 'downloadTemplate', data: { title: '东林视频', fileName: '搞笑.mp4', progressValue: 80 } } }
// 发布通知 notificationManager.publish(notificationRequest, (err: BusinessError) => { if (err) { hilog.error(DOMAIN_NUMBER, TAG, `Failed to publish notification. Code is ${err.code}, message is ${err.message}`); return; } hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in publishing notification.'); }); } else { promptAction.showToast({ message: '不支持进度条通知' }) } }).catch((err: BusinessError) => { hilog.error(DOMAIN_NUMBER, TAG, `Failed to support download template notification. Code is ${err.code}, message is ${err.message}`); });

}
/** * 取消发布 */ cancelPublish() { notificationManager.cancel(1, (err: BusinessError) => { if (err) { hilog.error(DOMAIN_NUMBER, TAG, `Failed to cancel notification. Code is ${err.code}, message is ${err.message}`); return; } hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in cancel notification.'); }); }
build() { Column() { Button('发布进度条通知').onClick(() => { this.publish() }).margin(100) Button('取消发布进度条通知').onClick(() => { this.cancelPublish() })
} .height('100%') .width('100%') .justifyContent(FlexAlign.Center) }}
复制代码


注意:东林在下节案例给大家具体说下载进度条的用法,真实的模拟下载进度通知

6. 用户通知服务-通知行为意图

6.1 基本介绍

当发布通知时,如果期望用户可以通过点击通知栏拉起目标应用组件或发布公共事件,可以通过 Ability Kit 申请 WantAgent 封装至通知消息中。

6.2 接口方法

6.3 代码示例

import { notificationManager } from '@kit.NotificationKit';import { BusinessError } from '@kit.BasicServicesKit';import { hilog } from '@kit.PerformanceAnalysisKit';import { common } from '@kit.AbilityKit';import { wantAgent, WantAgent } from '@kit.AbilityKit'
// 日志标识const TAG: string = '[publishTest]';const DOMAIN_NUMBER: number = 0xFF00;let context = getContext(this) as common.UIAbilityContext;
@Entry@Componentstruct Page2 { /** * 请求通知授权 */ aboutToAppear(): void { notificationManager.isNotificationEnabled().then((data: boolean) => { hilog.info(DOMAIN_NUMBER, TAG, "isNotificationEnabled success, data: " + JSON.stringify(data)); if (!data) { notificationManager.requestEnableNotification(context).then(() => { hilog.info(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification success`); }).catch((err: BusinessError) => { if (1600004 == err.code) { hilog.error(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification refused, code is ${err.code}, message is ${err.message}`); } else { hilog.error(DOMAIN_NUMBER, TAG, `[ANS] requestEnableNotification failed, code is ${err.code}, message is ${err.message}`); } }); } }).catch((err: BusinessError) => { hilog.error(DOMAIN_NUMBER, TAG, `isNotificationEnabled fail, code is ${err.code}, message is ${err.message}`); }); }
/** * 通知方法 */ publish() {
let wantAgentObj:WantAgent; // 用于保存创建成功的wantAgent对象,后续使用其完成触发的动作。 // 通过WantAgentInfo的operationType设置动作类型 let wantAgentInfo:wantAgent.WantAgentInfo = { wants: [ { deviceId: '', bundleName: 'com.xt.myapplication', abilityName: 'EntryAbility', action: '', entities: [], uri: '', parameters: {} } ], actionType: wantAgent.OperationType.START_ABILITY, requestCode: 0, wantAgentFlags:[wantAgent.WantAgentFlags.CONSTANT_FLAG] };
// 创建WantAgent wantAgent.getWantAgent(wantAgentInfo, (err: BusinessError, data:WantAgent) => { if (err) { hilog.error(DOMAIN_NUMBER, TAG, `Failed to get want agent. Code is ${err.code}, message is ${err.message}`); return; } hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in getting want agent.'); wantAgentObj = data;
let notificationRequest: notificationManager.NotificationRequest = { // 通知的唯一id id: 1, content: { notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, // 普通文本类型通知 normal: { // 通知的标题 title: '百得知识库', // 通知的内容 text: '百得知识库提醒你该学习了', // 附加消息 additionalText: '百得', } }, // wantAgentObj使用前需要保证已被赋值(即步骤3执行完成) wantAgent: wantAgentObj, }; notificationManager.publish(notificationRequest, (err: BusinessError) => { if (err) { hilog.error(DOMAIN_NUMBER, TAG, `Failed to publish notification. Code is ${err.code}, message is ${err.message}`); return; } hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in publishing notification.'); }); }); }
/** * 取消指定的通知 */ cancelPublish() { notificationManager.cancel(1, (err: BusinessError) => { if (err) { hilog.error(DOMAIN_NUMBER, TAG, `Failed to cancel notification. Code is ${err.code}, message is ${err.message}`); return; } hilog.info(DOMAIN_NUMBER, TAG, 'Succeeded in cancel notification.'); }); }
build() { Column({ space: 20 }) {
Button('发布文本类型通知') .onClick(() => { this.publish() })
Button('取消通知') .onClick(() => { this.cancelPublish() })
} .height('100%') .width('100%') .justifyContent(FlexAlign.Center) }}
复制代码


发布于: 2 小时前阅读数: 10
用户头像

享受当下,享受生活,享受成长乐趣! 2025-02-26 加入

鸿蒙、Java、大数据

评论

发布
暂无评论
鸿蒙NEXT开发-用户通知服务_东林知识库_InfoQ写作社区