
摘要
在日常应用开发中,通知功能几乎是必不可少的。不管是聊天消息、系统提醒,还是任务进度更新,都需要通过通知来触达用户。对于开发者来说,如何在鸿蒙(HarmonyOS)应用中实现推送通知,是一个绕不开的问题。本文将带你从基础配置到实战代码,再到实际场景应用,完整地走一遍流程。
引言
目前的移动应用几乎都离不开通知:微信的消息提醒、支付宝的到账提醒、外卖平台的派送提醒......这些都是通知系统在背后支撑的。
在鸿蒙系统里,通知的实现主要依赖 通知服务(Notification Service)。它既支持本地通知(应用自己发出,比如闹钟提醒),也支持远程推送(服务端通过 Push 下发,比如系统更新提醒)。
接下来,我们会先走一遍最基础的流程:申请权限、构建通知、发送通知。之后再通过实际场景来看看通知功能是怎么用到真实应用里的。
鸿蒙通知开发全流程
申请权限
要想在鸿蒙里发送通知,必须先申请权限。在 module.json5
里声明:
json
{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.NOTIFICATION_CONTROLLER"
}
]
}
}
这一行配置就相当于告诉系统:"我的应用需要发通知"。如果你忘记写,应用运行时是没有权限发通知的。
构建通知并发送
通知分两部分:一个是 通知渠道(NotificationSlot) ,另一个是 通知内容(NotificationRequest)。
下面是一个最基础的 ArkTS 示例:
ts
import notificationManager from '@ohos.notificationManager';
async function sendNotification() {
// 1. 创建通知渠道(通常在应用启动时配置一次)
let slot: notificationManager.NotificationSlot = {
type: notificationManager.SlotType.SOCIAL_COMMUNICATION,
id: "default_slot",
name: "消息通知"
};
await notificationManager.addSlot(slot);
// 2. 构建通知内容
let notificationRequest: notificationManager.NotificationRequest = {
id: 1,
slotId: "default_slot",
content: {
contentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC,
normal: {
title: "鸿蒙推送通知",
text: "这是一条测试通知"
}
}
};
// 3. 发送通知
await notificationManager.publish(notificationRequest);
}
如果你把这段代码放到按钮点击事件里,就能直接在真机上跑起来,通知会显示在系统通知栏。
三个典型应用场景
本地提醒(比如闹钟/待办事项)
有时候应用需要在特定时间提醒用户,比如闹钟响起、待办任务到期。这时候就可以结合定时器和本地通知。
ts
import common from '@ohos.app.ability.common';
function scheduleLocalNotification() {
let context = getContext(this) as common.UIAbilityContext;
setTimeout(async () => {
await sendNotification(); // 调用前面写的 sendNotification()
}, 5000); // 5 秒后触发
}
这样,当用户设置了一个待办提醒,你就可以在指定的时间触发本地通知。
聊天消息(即时通讯场景)
在聊天类应用里,最常见的就是"新消息提醒"。通常服务端会通过 远程推送(Push Kit 或三方推送服务) 把消息推送到用户设备,客户端收到消息后,再通过通知栏提醒用户。
伪代码大概是这样的:
ts
// 收到服务器下发的推送消息
async function onPushMessageReceived(message: any) {
let notificationRequest: notificationManager.NotificationRequest = {
id: Date.now(), // 用时间戳避免重复
slotId: "default_slot",
content: {
contentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC,
normal: {
title: "新消息",
text: message.text
}
}
};
await notificationManager.publish(notificationRequest);
}
这样就能在系统通知栏里展示聊天消息,用户点击后可以直接进入对应的聊天界面。
系统级提醒(比如更新/后台任务完成)
有些时候应用需要在后台提醒用户,比如"下载完成"、"系统更新"。这类通知一般不会频繁触发,但对用户体验很重要。
ts
async function showUpdateNotification() {
let notificationRequest: notificationManager.NotificationRequest = {
id: 99,
slotId: "default_slot",
content: {
contentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC,
normal: {
title: "系统更新",
text: "新版本已下载完成,点击安装"
}
}
};
await notificationManager.publish(notificationRequest);
}
这里的关键是:即便应用退到后台,通知依然能触发,让用户不会错过重要消息。
QA 环节
Q1:通知和弹窗有什么区别?
通知是系统层面的,用户可以在通知栏集中查看,适合长期提醒;而弹窗(Dialog/Toast)通常是临时展示的,用户关掉就没了。
Q2:通知能否带动作?
可以。通知支持设置点击事件,用户点击后可以打开应用的特定页面(比如跳到聊天详情页)。
Q3:远程推送和本地通知有什么关系?
远程推送只是消息来源的一种,本地通知是最终展示的方式。一般流程是:服务端推送消息 → 客户端接收 → 调用本地通知 API 展示。
总结
在鸿蒙应用开发中,推送通知是一个很常见的功能点。它的实现流程其实并不复杂,分成三步就能搞定:
在 module.json5
里申请权限。
定义通知渠道和通知内容。
调用 notificationManager.publish
发送通知。
同时,不同的场景下,通知的使用方式也有所区别:闹钟提醒用定时+本地通知,聊天消息用远程推送+本地通知,系统更新用后台任务+本地通知。
只要你掌握了基础用法,就可以很容易扩展到各种业务场景中。