news 2026/5/8 21:03:23

鸿蒙技术干货7:通知发送与跳转服务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
鸿蒙技术干货7:通知发送与跳转服务

今天开始咱们的系统服务调用系列分享。系统服务是鸿蒙应用与底层系统交互的核心通道,而通知服务(NotificationCenter)更是高频刚需 —— 无论是消息推送、事件提醒还是功能跳转,都离不开它。这篇咱们聚焦 NotificationCenter 的核心用法,从权限申请、通知创建到点击跳转,结合实战代码一步步拆解,为后续位置提醒 APP的开发打牢基础!

一、通知服务核心认知

1. 通知的应用场景

鸿蒙的通知服务支持多种场景:

  • 系统事件提醒(如位置到达、任务到期)

  • 应用内消息推送(如好友消息、更新提示)

  • 功能快捷入口(如通知栏直接操作应用功能)

  • 重要信息展示(如验证码、交易通知)

2. 核心 API 与权限要求

  • 核心模块:@ohos.notification(NotificationCenter)

  • 必备权限:ohos.permission.NOTIFICATION_CONTROLLER(API9+)

  • 关键能力:创建通知、设置样式、发送通知、监听点击事件、取消通知

二、通知开发三步走:权限 - 创建 - 发送

1. 权限申请(合规第一步)

通知权限属于普通权限,但仍需在配置文件声明并动态申请(部分设备默认关闭):

// module.json5 配置声明 { "module": { "requestPermissions": [ { "name": "ohos.permission.NOTIFICATION_CONTROLLER", "reason": "用于发送位置到达提醒通知", "usedScene": { "abilities": ["MainAbility"], "when": "always" } } ] } }

动态申请代码(结合权限管理模块):

import abilityAccessCtrl from '@ohos.abilityAccessCtrl'; import notification from '@ohos.notification'; import common from '@ohos.app.ability.common'; /** * 检查并申请通知权限 */ export async function requestNotificationPermission(context: common.UIAbilityContext): Promise<boolean> { const atManager = abilityAccessCtrl.createAtManager(); try { // 检查权限状态 const authResult = await atManager.checkAccessToken( abilityAccessCtrl.createTokenID(), 'ohos.permission.NOTIFICATION_CONTROLLER' ); if (authResult === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) { console.log('通知权限已授予'); return true; } // 动态申请权限 const reqResult = await atManager.requestPermissionsFromUser(context, ['ohos.permission.NOTIFICATION_CONTROLLER']); const granted = reqResult.authResults[0] === 0; console.log(`通知权限申请结果:${granted ? '成功' : '失败'}`); return granted; } catch (err) { console.error(`通知权限处理异常:${JSON.stringify(err)}`); return false; } }

2. 创建通知实例(自定义样式)

鸿蒙支持多种通知样式(普通通知、长文本通知、图片通知等),咱们以位置提醒场景常用的普通通知为例,包含标题、内容和跳转入口:

import notification from '@ohos.notification'; import wantAgent from '@ohos.wantAgent'; import common from '@ohos.app.ability.common'; /** * 创建位置提醒通知实例 * @param context 上下文 * @param title 通知标题 * @param content 通知内容 * @returns 通知实例 */ export async function createLocationReminderNotification( context: common.UIAbilityContext, title: string, content: string ): Promise<notification.Notification> { // 1. 创建跳转代理(点击通知跳转应用页面) const wantAgentInfo = { wants: [{ bundleName: context.applicationInfo.bundleName, abilityName: 'MainAbility', parameters: { 'from': 'notification', 'type': 'location_reminder' } // 携带跳转参数 }], operationType: wantAgent.OperationType.START_ABILITY, requestCode: 1002 }; const jumpAgent = await wantAgent.getWantAgent(wantAgentInfo); // 2. 构建通知内容 const notificationContent = new notification.NotificationContent({ contentType: notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, normal: { title: title, text: content, additionalText: '点击查看详情' } }); // 3. 构建通知请求 const notificationRequest = { id: Date.now(), // 通知唯一ID(用于后续取消) content: notificationContent, wantAgent: jumpAgent, // 绑定跳转事件 priority: notification.Priority.HIGH, // 优先级(高优先级会主动弹窗) showOnLockScreen: true, // 锁屏显示 isAutoCancel: true // 点击后自动取消 }; return notificationRequest; }

3. 发送与取消通知

import notification from '@ohos.notification'; // 全局存储通知ID(用于取消) let currentNotificationId: number = -1; /** * 发送通知 */ export async function sendNotification(notificationRequest: notification.Notification): Promise<boolean> { try { // 保存通知ID currentNotificationId = notificationRequest.id; // 发送通知 await notification.publish(notificationRequest); console.log(`通知发送成功,ID:${currentNotificationId}`); return true; } catch (err) { console.error(`通知发送失败:${JSON.stringify(err)}`); return false; } } /** * 取消通知(单个或全部) */ export async function cancelNotification(notificationId?: number) { try { if (notificationId) { await notification.cancel(notificationId); console.log(`取消通知成功,ID:${notificationId}`); } else { await notification.cancelAll(); console.log('取消所有通知成功'); } } catch (err) { console.error(`取消通知失败:${JSON.stringify(err)}`); } }

三、实战:通知点击跳转与参数接收

1. 接收跳转参数

在目标 Ability 的onCreateonNewWant中接收通知跳转参数:

// MainAbility.ets onNewWant(want: Want) { // 接收通知跳转参数 const from = want.parameters?.['from']; const type = want.parameters?.['type']; if (from === 'notification' && type === 'location_reminder') { console.log('从位置提醒通知跳转进入'); // 跳转到位置详情页 this.context.startAbility({ url: 'pages/LocationDetailPage' }); } }

2. 完整调用流程(UI 组件触发)

@Entry @Component struct NotificationDemoPage { private context = getContext(this) as common.UIAbilityContext; build() { Column({ space: 30 }) .width('100%') .height('100%') .padding(30) .backgroundColor('#f5f5f5') { Text('通知服务演示') .fontSize(32) .fontWeight(FontWeight.Bold) Button('申请通知权限') .type(ButtonType.Capsule) .width(250) .height(60) .backgroundColor('#2f54eb') .onClick(async () => { const granted = await requestNotificationPermission(this.context); Toast.show({ message: granted ? '权限申请成功' : '权限申请失败' }); }) Button('发送位置提醒通知') .type(ButtonType.Capsule) .width(250) .height(60) .backgroundColor('#2f54eb') .onClick(async () => { const notification = await createLocationReminderNotification( this.context, '位置提醒', '您已到达目标区域,点击查看详情' ); const success = await sendNotification(notification); Toast.show({ message: success ? '通知发送成功' : '通知发送失败' }); }) Button('取消当前通知') .type(ButtonType.Capsule) .width(250) .height(60) .backgroundColor('#ff4d4f') .onClick(() => { cancelNotification(currentNotificationId); }) } } }

四、实战踩坑指南

1. 通知不显示的常见原因

❶ 未申请权限:务必先通过动态申请获取NOTIFICATION_CONTROLLER权限;

❷ 通知 ID 重复:每次发送建议使用唯一 ID(如时间戳),避免覆盖已有通知;

❸ 应用处于后台冻结状态:需确保应用有后台运行权限(后续系列会讲);

2. 跳转失败的解决方案

❶ 检查want参数:bundleNameabilityName必须与配置文件一致;

❷ 目标页面未注册:确保跳转的 Ability 或 Page 已在main_pages.json中配置;

❸ 权限不足:部分场景需申请ohos.permission.START_ABILITIES_FROM_BACKGROUND权限。

加入班级,学习鸿蒙开发

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 20:45:51

Wan2.2-T2V-A14B生成视频的音频同步问题怎么解决

Wan2.2-T2V-A14B生成视频的音频同步问题怎么解决 你有没有遇到过这种情况&#xff1a;AI生成的画面流畅自然&#xff0c;主角缓缓站起、眼神坚定地说出那句“我不会放弃”——画面堪称电影级&#xff0c;可一开口&#xff0c;声音却慢了半拍&#xff1f;嘴一张&#xff0c;音还…

作者头像 李华
网站建设 2026/5/5 11:54:14

Steamless:DRM管理工具完全使用指南

在数字游戏时代&#xff0c;DRM保护机制虽然保护了开发者的权益&#xff0c;但也给合法用户带来了诸多不便。Steamless作为专业的DRM管理工具&#xff0c;专门针对SteamStub保护进行优化&#xff0c;让您能够更自由地使用自己购买的游戏。 【免费下载链接】Steamless Steamless…

作者头像 李华
网站建设 2026/4/24 16:26:48

解码器详解(训练过程)

前文介绍&#xff1a;前面我们以及介绍了自然语言序列输入到模型中进行的词嵌入和位置编码的数据变化过程&#xff0c;编码器的结构和数据流动过程&#xff0c;本文在前文的基础上继续接着介绍解码器中的数据流动过程和解码器结构&#xff0c;阅读本文前最好参考前文&#xff1…

作者头像 李华
网站建设 2026/5/8 16:06:45

FanControl多语言界面配置:从乱码到完美显示的实用指南

FanControl多语言界面配置&#xff1a;从乱码到完美显示的实用指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/f…

作者头像 李华
网站建设 2026/5/2 8:18:09

30.值对象进阶(上)-值对象优势简化关联提升可读性-代码质量提升50%

30 值对象进阶(上):值对象的优势 —— 简化关联、提升可读性 你好,欢迎来到第 30 讲。 在入门篇中,我们已经掌握了值对象的本质和实现方法。我们知道,它能将一组相关的属性“打包”成一个业务概念,让我们的代码更清晰、更健壮。 但如果值对象的作用仅限于此,那它的威…

作者头像 李华
网站建设 2026/5/5 9:29:55

大数据领域数据编目:保障数据质量的关键

大数据领域数据编目&#xff1a;保障数据质量的关键 关键词&#xff1a;大数据、数据编目、数据质量、元数据管理、数据治理、数据标准化、数据溯源 摘要&#xff1a;在大数据时代&#xff0c;数据量呈指数级增长&#xff0c;数据的复杂性也日益提高。数据编目作为数据治理的…

作者头像 李华