#创作者激励# 在HarmonyOS/OpenHarmony中如何发送通知消息 原创
【本文正在参加2023年第一期优质创作者激励计划】
在日常的开发中,我们常常会需要通过通知接口发送通知消息,那么在HarmonyOS/OpenHarmony中是如何实现的呢?
本文就来带大家了解一下。
通知
应用可以通过通知接口发送通知消息,终端用户可以通过通知栏查看通知内容,也可以点击通知来打开应用。
通知常见的使用场景:
- 显示接收到的短消息、即时消息等。
- 显示应用的推送消息,如广告、版本更新等。
- 显示当前正在进行的事件,如下载等。
HarmonyOS通过ANS(Advanced Notification Service,通知系统服务)对通知类型的消息进行管理,支持多种通知类型,如基础类型通知、进度条类型通知。
通知业务流程
通知业务流程由通知子系统、通知发送端、通知订阅端组成。
一条通知从通知发送端产生,通过IPC通信发送到通知子系统,再由通知子系统分发给通知订阅端。
系统应用还支持通知相关配置,如使能开关、配置参数由系统配置发起请求,发送到通知子系统存储到内存和数据库。
发布基础类型通知
基础类型通知主要应用于发送短信息、提示信息、广告推送等,支持普通文本类型、长文本类型、多行文本类型和图片类型。
表1 基础类型通知中的内容分类
类型 | 描述 |
---|---|
NOTIFICATION_CONTENT_BASIC_TEXT | 普通文本类型。 |
NOTIFICATION_CONTENT_LONG_TEXT | 长文本类型。 |
NOTIFICATION_CONTENT_MULTILINE | 多行文本类型。 |
NOTIFICATION_CONTENT_PICTURE | 图片类型。 |
目前系统仅通知栏订阅了通知,将通知显示在通知栏里。基础类型通知呈现效果示意图如下所示。
接口说明
通知发布接口如下表所示,不同发布类型通知由NotificationRequest的字段携带不同的信息。
接口名 | 描述 |
---|---|
publish(request: NotificationRequest, callback: AsyncCallback<void>): void | 发布通知。 |
cancel(id: number, label: string, callback: AsyncCallback<void>): void | 取消指定的通知。 |
cancelAll(callback: AsyncCallback<void>): void; | 取消所有该应用发布的通知。 |
NotificationRequest
描述通知的请求。
系统能力:以下各项对应的系统能力均为SystemCapability.Notification.Notification
名称 | 类型 | 可读 | 可写 | 说明 |
---|---|---|---|---|
content | NotificationContent | 是 | 是 | 通知内容。 |
id | number | 是 | 是 | 通知ID。 |
slotType | SlotType | 是 | 是 | 通道类型。 |
isOngoing | boolean | 是 | 是 | 是否进行时通知。 |
isUnremovable | boolean | 是 | 是 | 是否可移除。 |
deliveryTime | number | 是 | 是 | 通知发送时间。 |
tapDismissed | boolean | 是 | 是 | 通知是否自动清除。 |
autoDeletedTime | number | 是 | 是 | 自动清除的时间。 |
wantAgent | WantAgent | 是 | 是 | WantAgent封装了应用的行为意图,点击通知时触发该行为。 |
extraInfo | {[key: string]: any} | 是 | 是 | 扩展参数。 |
color | number | 是 | 是 | 通知背景颜色。暂不支持。 |
colorEnabled | boolean | 是 | 是 | 通知背景颜色是否使能。暂不支持。 |
isAlertOnce | boolean | 是 | 是 | 设置是否仅有一次此通知警报。 |
isStopwatch | boolean | 是 | 是 | 是否显示已用时间。 |
isCountDown | boolean | 是 | 是 | 是否显示倒计时时间。 |
isFloatingIcon | boolean | 是 | 是 | 是否显示状态栏图标。 |
label | string | 是 | 是 | 通知标签。 |
badgeIconStyle | number | 是 | 是 | 通知角标类型。 |
showDeliveryTime | boolean | 是 | 是 | 是否显示分发时间。 |
actionButtons | Array<NotificationActionButton> | 是 | 是 | 通知按钮,最多两个按钮。 |
smallIcon | PixelMap | 是 | 是 | 通知小图标。 |
largeIcon | PixelMap | 是 | 是 | 通知大图标。 |
creatorBundleName | string | 是 | 否 | 创建通知的包名。 |
creatorUid | number | 是 | 否 | 创建通知的UID。 |
creatorPid | number | 是 | 否 | 创建通知的PID。 |
creatorUserId8+ | number | 是 | 否 | 创建通知的UserId。 |
hashCode | string | 是 | 否 | 通知唯一标识。 |
groupName8+ | string | 是 | 是 | 组通知名称。 |
template8+ | NotificationTemplate | 是 | 是 | 通知模板。 |
distributedOption8+ | DistributedOptions | 是 | 是 | 分布式通知的选项。 |
notificationFlags8+ | NotificationFlags | 是 | 否 | 获取NotificationFlags。 |
removalWantAgent9+ | WantAgent | 是 | 是 | 当移除通知时,通知将被重定向到的WantAgent实例。 |
badgeNumber9+ | number | 是 | 是 | 应用程序图标上显示的通知数。 |
开发步骤
1.导入模块。
import NotificationManager from '@ohos.notificationManager';
2.构造NotificationRequest对象,
构造NotificationRequest对象,并发布通知。
-
普通文本类型通知由标题、文本内容和附加信息三个字段组成,其中标题和文本内容是必填字段,大小均需要小于200字节。
Text("普通文本类型") .fontSize (50) .fontWeight(FontWeight.Bold).onClick(()=>{ let notificationRequest = { id: 1, content: { contentType: NotificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, // 普通文本类型通知 normal: { title: '通知标题',//通知标题。 text: '通知内容',//通知内容。 additionalText: '通知次要内容,是对通知内容的补充',//通知次要内容,是对通知内容的补充。 } } } NotificationManager.publish(notificationRequest, (err) => { if (err) { console.error(`[ANS] failed to publish, error[${err}]`); return; } console.info(`[ANS] publish success`); }); })
-
长文本类型通知继承了普通文本类型的字段,同时新增了长文本内容、内容概要和通知展开时的标题,其中长文本内容不超过1024字节,其他字段小于200字节。通知默认显示与普通文本相同,展开后,标题显示为展开后标题内容,内容为长文本内容。
Text("长文本类型通知")
.fontSize (50)
.fontWeight(FontWeight.Bold).onClick(()=>{
let notificationRequest = {
id: 1,
content: {
contentType: NotificationManager.ContentType.NOTIFICATION_CONTENT_LONG_TEXT, // 长文本类型通知
longText: {
title: '通知标题',//通知标题。
text: '通知内容',//通知内容。
additionalText: '通知次要内容,是对通知内容的补充',//通知次要内容,是对通知内容的补充。
longText: 'test_通知的长文本',//通知的长文本
briefText: '通知概要内容,是对通知内容的总结',// 通知概要内容,是对通知内容的总结
expandedTitle: '通知展开时的标题',
}
}
}
// 发布通知
NotificationManager.publish(notificationRequest, (err) => {
if (err) {
console.error(`[ANS] failed to publish, error[${err}]`);
return;
}
console.info(`[ANS] publish success`);
});
})
- 多行文本类型通知继承了普通文本类型的字段,同时新增了多行文本内容、内容概要和通知展开时的标题,其字段均小于200字节。通知默认显示与普通文本相同,展开后,标题显示为展开后标题内容,多行文本内容多行显示。
Text("多行文本类型")
.fontSize (50)
.fontWeight(FontWeight.Bold).onClick(()=>{
let notificationRequest = {
id: 1,
content: {
contentType: NotificationManager.ContentType.NOTIFICATION_CONTENT_MULTILINE, // 多行文本类型通知
multiLine: {
title: '通知标题',//通知标题。
text: '通知内容',//通知内容。
briefText: '通知概要内容,是对通知内容的总结',// 通知概要内容,是对通知内容的总结
longTitle: 'test_longTitle',//通知展开时的标题
lines: ['line_01', 'line_02', 'line_03', 'line_04'],
}
}
}
// 发布通知
NotificationManager.publish(notificationRequest, (err) => {
if (err) {
console.error(`[ANS] failed to publish, error[${err}]`);
return;
}
console.info(`[ANS] publish success`);
});
})
-
图片类型通知继承了普通文本类型的字段,同时新增了图片内容、内容概要和通知展开时的标题,图片内容为PixelMap型对象,其大小不能超过2M。
let notificationPicture: PixelMap = undefined; // 需要获取图片PixelMap信息 let notificationRequest = { id: 1, content: { contentType: NotificationManager.ContentType.NOTIFICATION_CONTENT_PICTURE, picture: { title: '通知标题',//通知标题。 text: '通知内容',//通知内容。 additionalText: '通知次要内容,是对通知内容的补充',//通知次要内容,是对通知内容的补充。 longText: 'test_通知的长文本',//通知的长文本 briefText: '通知概要内容,是对通知内容的总结',// 通知概要内容,是对通知内容的总结 expandedTitle: '通知展开时的标题', picture: notificationPicture//通知的图片内容。 } } } // 发布通知 NotificationManager.publish(notificationRequest, (err) => { if (err) { console.error(`[ANS] failed to publish, error[${err}]`); return; } console.info(`[ANS] publish success `); });