048 — notificationManager 通知管理:从本地通知到预算超支提醒
简介
通知是应用与用户保持联系的重要方式。在 MoneyTrack 中,通知系统承载着两个关键场景:一是用户设置的每日记账提醒(通过 reminderAgent,见 044 篇),二是预算超支的主动告警。当用户某个月的支出超过预设预算时,通过notificationManager发布系统通知,告知用户超支详情。结合通知渠道(Notification Channel)的划分和提醒设置页的开关控制,用户可以对通知进行精细化管控。
核心知识点
1. NotificationRequest 构建
系统通知通过NotificationRequest对象描述,以下是其核心属性:
| 属性 | 类型 | 说明 |
|---|---|---|
| content | NotificationContent | 通知内容主体(标题、正文、附加文本等) |
| notificationId | number | 通知唯一标识,用于更新/取消指定通知 |
| slotType | SlotType | 通知渠道类型(决定重要等级和提醒方式) |
| wantAgent | WantAgent | 点击通知后的跳转行为 |
| deliveryTime | number | 通知下发时间(毫秒时间戳) |
| groupName | string | 通知分组名称,用于折叠展示 |
| badgeNumber | number | 角标数字,显示在应用图标上 |
2. notificationManager 完整 API
notificationManager提供了通知的完整生命周期管理:
- 发布通知:
notificationManager.publish(request)发布一条通知,需要传入 NotificationRequest。 - 取消通知:
notificationManager.cancel(notificationId)取消指定 ID 的通知。 - 取消所有:
notificationManager.cancelAll()取消当前应用的所有通知。 - 订阅通知:
notificationManager.subscribe(subscriber, info)订阅系统通知事件,可监听通知的发布、删除等操作。 - 取消订阅:
notificationManager.unsubscribe(subscriber)取消通知订阅。
3. 通知渠道管理
鸿蒙通知系统要求所有通知归属于某个渠道(Slot),渠道定义了通知的语义类别和系统行为。用户可以在系统设置中为每个渠道独立开启/关闭通知,实现精细化控制。
| 渠道类型 | 值 | 说明 | 重要等级 |
|---|---|---|---|
| SOCIAL_COMMUNICATION | 0 | 社交通信类 | 高(响铃+振动) |
| SERVICE_INFORMATION | 1 | 服务信息类 | 中(振动) |
| CONTENT_INFORMATION | 2 | 内容资讯类 | 低(静音) |
| LIVE_VIEW | 3 | 实况通知类 | 高(响铃+振动) |
| CUSTOMER_SERVICE | 4 | 客服消息类 | 中(振动) |
4. 通知点击跳转
通过设置NotificationRequest的wantAgent,用户点击通知时可以跳转到应用内的指定页面。wantAgent支持携带自定义参数,实现精准的页面路由。
5. 通知的完整生命周期
项目代码案例
预算超支提醒:
import{notificationManager}from'@kit.NotificationKit';import{wantAgent}from'@kit.AbilityKit';exportclassBudgetNotifier{// 发布预算超支通知staticasyncpublishOverBudgetAlert(budget:number,spent:number){constwantAgentObj=awaitwantAgent.getWantAgent({wants:[{bundleName:'com.moneytrack',abilityName:'BillListAbility',parameters:{filter:'current_month',fromNotification:true}}],operationType:wantAgent.OperationType.START_ABILITY});constrequest:notificationManager.NotificationRequest={content:{contentType:notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,text:`本月已支出 ¥${spent},已超预算 ¥${budget}`,title:'预算超支提醒',additionalText:'点击查看本月账单详情'},notificationId:1001,slotType:notificationManager.SlotType.SERVICE_INFORMATION,wantAgent:wantAgentObj,deliveryTime:Date.now(),badgeNumber:1};awaitnotificationManager.publish(request);}// 取消预算超支通知staticasynccancelOverBudgetAlert(){awaitnotificationManager.cancel(1001);}// 订阅通知事件(如统计通知点击率)staticsubscribeNotificationEvents(){constsubscriber={onConsume:(data)=>{console.info(`通知被消费:${JSON.stringify(data.request.content)}`);},onCancel:(data)=>{console.info(`通知被取消:${data.request.notificationId}`);}};notificationManager.subscribe(subscriber);returnsubscriber;// 保留引用以便后续取消订阅}}提醒设置页控制通知开关:
@Componentstruct NotificationSettings{@StorageProp('budgetAlertEnabled')budgetAlertEnabled:boolean=true;build(){Column(){Toggle({type:ToggleType.Switch,isOn:this.budgetAlertEnabled}).onChange((isOn)=>{AppStorage.set('budgetAlertEnabled',isOn);if(!isOn){BudgetNotifier.cancelOverBudgetAlert();}})}}}通知渠道管理
用户可以通过系统设置 > 应用 > MoneyTrack > 通知管理,对每个通知渠道独立进行开关控制:
- 服务信息(SERVICE_INFORMATION):管控预算超支等应用服务通知。
- 社交通信(SOCIAL_COMMUNICATION):管控好友互动等社交类通知。
- 内容资讯(CONTENT_INFORMATION):管控推荐内容等资讯通知。
开发者需要通过notificationManager.addSlot()在应用启动时注册渠道,用户此后即可在系统设置中操作。
// 应用启动时注册通知渠道asyncfunctioninitNotificationChannels(){awaitnotificationManager.addSlot(notificationManager.SlotType.SERVICE_INFORMATION);awaitnotificationManager.addSlot(notificationManager.SlotType.SOCIAL_COMMUNICATION);}最佳实践
- 合理选择 SlotType:根据通知的紧急程度选择对应的渠道类型,避免过量使用高优先级渠道导致用户关闭所有通知。
- 使用唯一 notificationId:为同一类型的通知分配固定 ID,便于后续更新和取消;不同类型的通知使用不同 ID 防止相互覆盖。
- 携带 wantAgent 跳转参数:在通知中附带路由参数,用户点击后直接到达目标页面,减少用户的导航层级。
- 结合设置开关:在应用内提供通知开关,与系统渠道设置配合,给予用户多重控制能力。
- 及时取消无效通知:当触发条件不再满足时(如预算已调整),及时取消对应的通知,避免用户看到过时信息。
- 监听通知状态:通过
subscribe监听通知的发布和取消事件,用于统计通知触达率和用户行为分析。
提醒设置页提供开关控制用户是否接收预算超支通知,通过约束AppStorage中的配置变量来控制是否调用publishOverBudgetAlert,实现了通知的可控性和灵活性。
推荐参考文档
- 通知管理指南
- @kit.NotificationKit API 参考
- WantAgent API 参考