外贸小网站建设广州市平安建设 网站
2026/3/21 10:53:24 网站建设 项目流程
外贸小网站建设,广州市平安建设 网站,网站备案信息下载,网站建设计什么费用文章目录 前言一、 通道管理 通知的分类与权限基石1. Slot 类型与应用场景2. 初始化通道的代码实现3. 配置说明 二、 基础通知 ID 管理与内容构建1. ID 的作用与策略2. 基础文本通知实现 三、 动态更新 进度条通知与节流策略1. 性能陷阱#xff1a;高频更新2. 解决方案#x…文章目录前言一、 通道管理 通知的分类与权限基石1. Slot 类型与应用场景2. 初始化通道的代码实现3. 配置说明二、 基础通知 ID 管理与内容构建1. ID 的作用与策略2. 基础文本通知实现三、 动态更新 进度条通知与节流策略1. 性能陷阱高频更新2. 解决方案节流控制3. 进度条通知封装代码四、 实况窗 (LiveView) 全生命周期的伴随服务1. 实况窗的两种形态与位置2. 生命周期管理3. 数据结构4. 封装代码五、 交互性 让通知可点击 (WantAgent)1. 构建 WantAgent2. 代码集成总结前言在移动应用开发中通知系统是应用与用户保持连接的核心渠道。随着 HarmonyOS 6 (API 20) 的发布通知系统已经从单纯的信息告知工具演变为具备实时性、交互性和伴随性的服务载体。特别是实况窗LiveView功能的引入彻底改变了用户获取关键信息的方式使得服务状态可以在状态栏、锁屏界面以胶囊或卡片的形式实时呈现。本文将深入讲解如何在 HarmonyOS 6 环境下构建一个完整的通知体系。我们将跳过基础的概念堆砌直接进入工程实战。你将掌握如何管理通知通道Slot以符合系统合规性要求如何通过节流策略优化高频进度更新以及如何开发全生命周期的实况窗功能。通过本文的学习你将能够编写出可直接用于生产环境的通知管理模块。一、 通道管理 通知的分类与权限基石在 HarmonyOS 的通知框架中通知通道NotificationSlot是发送通知的前置条件。系统不再允许应用随意发送未分类的通知而是强制要求开发者根据通知的内容属性进行分类。这不仅关乎用户体验更直接决定了通知的展示方式是否弹窗、是否有声音、是否震动以及在系统中的优先级。1. Slot 类型与应用场景NotificationManager定义了多种 Slot 类型我们在初始化时必须明确指定社交通讯 (SOCIAL_COMMUNICATION)拥有最高优先级。适用于即时通讯IM应用的私聊、群聊消息。此类通知通常允许在屏幕顶部横幅弹出并伴有声音和震动。服务提醒 (SERVICE_INFORMATION)拥有默认优先级。适用于即时且必要的服务状态变更如“外卖已接单”、“打车排队中”、“快递派送中”。内容资讯 (CONTENT_INFORMATION)拥有较低优先级。适用于新闻推荐、营销活动。此类通知通常会静默展示在通知中心不会主动打断用户。其他 (OTHER)用于不属于上述分类的场景优先级最低。2. 初始化通道的代码实现通道的注册通常放在应用启动的生命周期中如Ability的onCreate或页面的aboutToAppear。以下是封装好的通道初始化逻辑import { notificationManager } from kit.NotificationKit; import { BusinessError } from kit.BasicServicesKit; /** * 初始化通知通道 * 建议在 EntryAbility.ets 的 onCreate 中调用 */ async function initNotificationSlots() { try { // 定义一个服务类型的 Slot const serviceSlot: notificationManager.NotificationSlot { // 指定 Slot 类型为服务提醒 type: notificationManager.SlotType.SERVICE_INFORMATION, // 设置优先级等级为默认 level: notificationManager.SlotLevel.LEVEL_DEFAULT, // 通道描述用户在系统设置中查看通知权限时会看到此文案 desc: 用于业务状态变更和任务进度提醒, // 设置通知在锁屏上的显示模式 lockscreenVisibility: notificationManager.LockScreenVisibility.PUBLIC, // 开启角标提示 badgeFlag: true }; // 向系统注册 Slot await notificationManager.addSlot(notificationManager.SlotType.SERVICE_INFORMATION); console.info([Notification] Service slot initialized successfully); } catch (err) { const error err as BusinessError; console.error([Notification] Failed to add slot. Code: ${error.code}, Message: ${error.message}); } }3. 配置说明type: 必须与后续发送NotificationRequest中的类型匹配否则可能导致通知无法发出。lockscreenVisibility: 决定了锁屏状态下通知内容的可见性。对于涉及隐私的信息如验证码应设置为SECRET或PRIVATE。badgeFlag: 决定当有未读通知时桌面应用图标右上角是否显示红点或数字角标。二、 基础通知 ID 管理与内容构建发送通知的核心对象是NotificationRequest。在实际开发中我们需要特别注意ID 管理和幂等性问题。1. ID 的作用与策略每个通知都有一个整型 ID。新增当发送一个全新的 ID 时系统会在通知栏创建一条新记录。更新当使用已存在的 ID 发送通知时系统会直接覆盖旧通知的内容而不会产生堆叠。策略对于IM 消息通常希望每条消息独立显示可以使用自增 ID 或随机 ID。对于状态更新如“下载中” - “下载完成”必须使用固定 ID确保进度条在原地刷新。2. 基础文本通知实现以下是一个发送标准文本通知的封装方法/** * 发送基础文本通知 * param title 标题 * param text 内容 */ async function publishBasicNotification(title: string, text: string) { // 生成一个随机 ID用于演示多条通知并存的效果 // 实际业务中请根据需求管理 ID const notificationId Math.floor(Math.random() * 10000); const request: notificationManager.NotificationRequest { id: notificationId, // 指定该通知使用的通道类型必须已通过 addSlot 注册 notificationSlotType: notificationManager.SlotType.SERVICE_INFORMATION, content: { // 指定内容类型为普通文本 notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, normal: { title: title, text: text, // 附加信息通常显示在通知的次要位置 additionalText: 系统通知 } } }; try { await notificationManager.publish(request); console.info([Notification] Published basic notification, ID: ${notificationId}); } catch (err) { console.error([Notification] Publish failed: ${JSON.stringify(err)}); } }三、 动态更新 进度条通知与节流策略在文件下载、视频转码或数据同步场景中我们需要向用户展示实时进度。HarmonyOS 提供了预置的下载模板 (DOWNLOAD_TEMPLATE)使我们无需自定义布局即可展示标准的进度条样式。1. 性能陷阱高频更新开发者容易犯的一个错误是在下载回调中每接收到一个数据包就刷新一次通知。例如每下载 1KB 就调用一次publish。这会导致系统负载过高频繁的 IPC进程间通信调用会占用大量 CPU。UI 卡顿通知栏渲染线程过载导致用户下拉通知栏时出现掉帧。2. 解决方案节流控制我们需要实现一个节流逻辑仅当进度变化超过一定阈值如 1%或时间间隔超过一定时长如 500ms时才触发系统通知更新。3. 进度条通知封装代码/** * 进度条通知管理器 */ class ProgressNotificationManager { private lastUpdateTime: number 0; private lastProgress: number -1; // 固定 ID保证更新的是同一条通知 private readonly NOTIFICATION_ID 1001; /** * 发送或更新进度 * param progress 当前进度 (0-100) * param isDone 是否完成 */ async updateProgress(progress: number, isDone: boolean false) { const now Date.now(); // 节流策略 // 1. 如果任务完成强制更新。 // 2. 如果距离上次更新不足 500ms 且进度变化小于 1%则跳过。 if (!isDone (now - this.lastUpdateTime 500) (progress - this.lastProgress 1)) { return; } this.lastUpdateTime now; this.lastProgress progress; // 构建下载模板 const template: notificationManager.NotificationTemplate { name: downloadTemplate, // 系统预置模板名称 data: { progressValue: progress, // 当前进度值 progressMaxValue: 100, // 最大值 isProgressIndeterminate: false // false 表示确定的进度条true 表示无限加载动画 } }; const request: notificationManager.NotificationRequest { id: this.NOTIFICATION_ID, notificationSlotType: notificationManager.SlotType.SERVICE_INFORMATION, template: template, // 应用模板 content: { notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, normal: { title: isDone ? 下载完成 : 资源下载中..., text: isDone ? 文件已保存 : 当前进度${progress}%, additionalText: isDone ? : 请保持网络连接 } } }; try { await notificationManager.publish(request); } catch (err) { console.error([Notification] Progress update failed: ${JSON.stringify(err)}); } } }四、 实况窗 (LiveView) 全生命周期的伴随服务实况窗是 HarmonyOS 6 区别于传统 Android 通知系统的核心特性。它不再是一条静止的消息而是一个具备生命周期的、实时的状态窗口。1. 实况窗的两种形态与位置胶囊态 (Capsule)显示在屏幕左上角的状态栏区域。空间极其有限通常只显示一个图标和简短的状态文本如“配送中 15分”。卡片态 (Card)用户点击胶囊或在锁屏/通知中心查看时展开。空间较大可以展示详细信息如地图、司机信息、当前位置。2. 生命周期管理实况窗不仅是“发送”那么简单它遵循严格的生命周期创建 (Create)业务开始如用户下单成功系统生成实况窗。更新 (Update)业务进行中如骑手位置变化应用高频刷新实况窗数据。结束 (End)业务结束如订单送达应用主动取消实况窗将其转化为历史记录或销毁。3. 数据结构实况窗使用NOTIFICATION_CONTENT_SYSTEM_LIVE_VIEW内容类型。为了保证系统 UI 的统一性开发者不需要编写 XML 布局而是通过extraInfo传递特定的 JSON 数据系统会自动渲染。4. 封装代码class LiveViewManager { private readonly LIVE_VIEW_ID 2002; /** * 发布/更新实况窗 * param status 简短状态描述 (用于胶囊和标题) * param detail 详细描述 */ async publishLiveView(status: string, detail: string) { const request: notificationManager.NotificationRequest { id: this.LIVE_VIEW_ID, notificationSlotType: notificationManager.SlotType.LIVE_VIEW, // 注意实况窗有专用 Slot 类型 isOngoing: true, // 设置为常驻通知用户无法左滑清除 isAlertOnce: true, // 仅首次提醒后续更新静默 content: { notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_SYSTEM_LIVE_VIEW, systemLiveView: { title: 即时配送, text: status, typeCode: 1, // 业务类型码不同类型对应不同的系统默认图标风格 // 扩展参数用于定义胶囊和卡片的具体 UI 字段 // 注意实际开发中需查阅 LiveView 文档匹配 key 值 extraInfo: { capsule: { status: status, icon: capsule_icon_delivery, backgroundColor: #007DFF }, card: { title: 您的订单正在配送中, content: detail, subContent: 预计 14:30 送达 } } } } }; try { await notificationManager.publish(request); console.info([Notification] LiveView published); } catch (err) { console.error([Notification] LiveView failed: ${JSON.stringify(err)}); } } /** * 结束实况窗 */ async stopLiveView() { try { // 取消通知即视为结束实况窗 await notificationManager.cancel(this.LIVE_VIEW_ID); console.info([Notification] LiveView stopped); } catch (err) { console.error([Notification] Stop failed: ${JSON.stringify(err)}); } } }五、 交互性 让通知可点击 (WantAgent)默认发送的通知是不可点击的。为了实现“点击通知跳转到应用详情页”我们需要使用WantAgent。1. 构建 WantAgentWantAgent是一个封装了意图Want的对象它允许通知服务在用户点击通知时代表应用去执行这个意图如启动 UIAbility。2. 代码集成我们需要修改NotificationRequest的构建逻辑增加wantAgent字段。import { wantAgent, WantAgent } from kit.AbilityKit; async function createWantAgent(context: Context): PromiseWantAgent { const wantInfo: wantAgent.WantAgentInfo { wants: [ { deviceId: , bundleName: com.example.notificationdemo, abilityName: EntryAbility, // 跳转的目标 Ability action: ohos.want.action.home, entities: [] } ], // 动作类型启动 Ability operationType: wantAgent.OperationType.START_ABILITY, // 请求码 requestCode: 0, // 标志位如果目标 Ability 已存在则更新它而不是重新创建 wantAgentFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG] }; return await wantAgent.getWantAgent(wantInfo); } // 在发送通知时 // request.wantAgent await createWantAgent(context);总结在 HarmonyOS 6 中构建高质量的通知体系需要关注三个维度规范性 (Compliance)严格遵守Slot通道分类确保通知类型与系统定义匹配这是通知能正常展示的前提。性能 (Performance)在处理高频状态更新如进度条时必须实施节流策略避免因过度刷新导致的系统卡顿和发热。体验 (Experience)充分利用实况窗 (LiveView)能力将离散的通知消息转化为连续的服务伴随实现信息在状态栏、锁屏、通知中心的无缝流转。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询