购物网站策划案社交系统开发

张小明 2026/3/2 18:15:27
购物网站策划案,社交系统开发,免费注册163邮箱帐号,金湖网站推广Harmony开发之公共事件与通知——应用间的沟通桥梁 引入#xff1a;跨应用协同的魔法 在日常使用手机时#xff0c;我们经常会遇到这样的场景#xff1a;当Wi-Fi连接成功后#xff0c;多个应用会同时弹出网络已连接的提示#xff1b;当收到新消息时#xff0…Harmony开发之公共事件与通知——应用间的沟通桥梁引入跨应用协同的魔法在日常使用手机时我们经常会遇到这样的场景当Wi-Fi连接成功后多个应用会同时弹出网络已连接的提示当收到新消息时即使应用在后台运行也能在通知栏看到提醒。这些看似简单的功能背后正是HarmonyOS公共事件与通知机制在发挥作用。它们如同应用间的神经系统让不同的应用能够感知系统状态变化实现跨应用的协同工作。一、公共事件与通知机制概述1.1 核心概念**公共事件Common Event**是HarmonyOS提供的应用间通信机制允许应用订阅系统或其他应用发布的事件实现后台的事件驱动通信。公共事件服务CES负责事件的订阅、发布和退订管理。**通知Notification**是应用向用户传递信息的主要方式通过通知增强服务ANS系统服务来为应用程序提供发布通知的能力。通知会在状态栏、通知中心等位置显示给用户支持多种样式和交互操作。1.2 通信模式对比特性公共事件通知通信模式订阅/发布单向、匿名的后台通信点对点/系统托管面向用户的交互可见性后台执行用户无感知状态栏、通知中心可见主要目的系统内部通信、状态同步人机交互、信息提醒参与者发布者、订阅者应用或系统服务发布者应用、系统服务、用户二、公共事件开发详解2.1 公共事件类型系统公共事件系统预定义的事件由系统服务在状态变化时发布常见的有usual.event.SCREEN_OFF屏幕关闭usual.event.WIFI_CONNECTEDWi-Fi已连接common.event.DEVICE_OFFLINE设备下线common.event.PACKAGE_REMOVED应用包被移除自定义公共事件应用为处理特定业务逻辑而定义的事件主要用于实现跨进程的事件通信能力。2.2 公共事件发送方式无序公共事件CES转发事件时不考虑订阅者接收顺序不保证顺序一致性。有序公共事件根据订阅者优先级顺序传递高优先级订阅者可修改事件内容或终止事件传递。粘性公共事件支持先发布后订阅事件会持久化在系统中供后续订阅者接收。2.3 核心接口类公共事件相关基础类包含CommonEventData封装公共事件相关信息CommonEventPublishInfo封装公共事件发布相关属性CommonEventSubscribeInfo封装公共事件订阅相关信息CommonEventSubscriber封装公共事件订阅者及相关参数CommonEventManager提供订阅、退订和发布公共事件的静态接口三、公共事件实战开发3.1 订阅公共事件import commonEvent from ohos.commonEventManager; import { BusinessError } from ohos.BasicServicesKit; // 订阅网络连接变化事件 async function subscribeNetworkEvent(): Promisevoid { try { const subscribeInfo { events: [usual.event.network.CONNECTIVITY_CHANGE] }; const subscriber await commonEvent.createSubscriber(subscribeInfo); commonEvent.subscribe(subscriber, (err: BusinessError, data: commonEvent.CommonEventData) { if (err) { console.error(订阅失败: ${err.code}, ${err.message}); return; } console.info(收到网络变化事件); // 处理网络状态变化逻辑 this.handleNetworkChange(); }); } catch (error) { console.error(创建订阅者失败:, error); } }3.2 发布自定义公共事件import commonEvent from ohos.commonEventManager; import { BusinessError } from ohos.BasicServicesKit; // 发布自定义公共事件 async function publishCustomEvent(): Promisevoid { try { const options: commonEvent.CommonEventPublishData { code: 1, data: 自定义事件数据 }; await commonEvent.publish(com.example.MY_CUSTOM_EVENT, options); console.info(自定义事件发布成功); } catch (error) { console.error(发布事件失败:, error); } } // 发布带权限的公共事件 async function publishPermissionEvent(): Promisevoid { try { const options: commonEvent.CommonEventPublishData { code: 1, data: 带权限的事件数据, subscriberPermissions: [com.example.permission.MY_PERMISSION] }; await commonEvent.publish(com.example.PERMISSION_EVENT, options); console.info(带权限事件发布成功); } catch (error) { console.error(发布带权限事件失败:, error); } }3.3 发布有序公共事件import commonEvent from ohos.commonEventManager; import { BusinessError } from ohos.BasicServicesKit; // 发布有序公共事件 async function publishOrderedEvent(): Promisevoid { try { const options: commonEvent.CommonEventPublishData { code: 1, data: 有序事件数据, isOrdered: true }; await commonEvent.publish(com.example.ORDERED_EVENT, options); console.info(有序事件发布成功); } catch (error) { console.error(发布有序事件失败:, error); } }3.4 发布粘性公共事件import commonEvent from ohos.commonEventManager; import { BusinessError } from ohos.BasicServicesKit; // 发布粘性公共事件 async function publishStickyEvent(): Promisevoid { try { const options: commonEvent.CommonEventPublishData { code: 1, data: 粘性事件数据, isSticky: true }; await commonEvent.publish(com.example.STICKY_EVENT, options); console.info(粘性事件发布成功); } catch (error) { console.error(发布粘性事件失败:, error); } }3.5 权限配置在module.json5中配置所需权限{ module: { reqPermissions: [ { name: ohos.permission.COMMONEVENT_STICKY, reason: 发布粘性公共事件, usedScene: { ability: [.MainAbility], when: inuse } }, { name: com.example.permission.MY_PERMISSION, reason: 自定义权限, usedScene: { ability: [.MainAbility], when: inuse } } ] } }四、通知开发详解4.1 通知类型HarmonyOS支持六种通知样式普通文本NOTIFICATION_CONTENT_BASIC_TEXT长文本NOTIFICATION_CONTENT_LONG_TEXT图片NOTIFICATION_CONTENT_PICTURE社交NOTIFICATION_CONVERSATIONAL_CONTENT多行文本NOTIFICATION_MULTILINE_CONTENT媒体NOTIFICATION_MEDIA_CONTENT4.2 通知重要级别NotificationSlot的级别支持LEVEL_NONE通知不发布LEVEL_MIN通知可以发布但不显示在通知栏LEVEL_LOW通知显示在通知栏不自动弹出LEVEL_DEFAULT通知显示在通知栏触发提示音LEVEL_HIGH通知显示在通知栏自动弹出触发提示音4.3 核心接口类通知相关基础类包含NotificationSlot设置提示音、振动、锁屏显示和重要级别NotificationRequest设置具体的通知对象NotificationHelper封装发布、更新、删除通知等静态方法五、通知实战开发5.1 创建通知渠道import { notificationManager } from kit.NotificationKit; import { BusinessError } from kit.BasicServicesKit; // 创建通知渠道 async function createNotificationSlot(): Promisevoid { try { const slot { id: slot_001, name: 默认通知渠道, level: notificationManager.SlotLevel.LEVEL_DEFAULT, enableVibration: true, lockscreenVisibleness: notificationManager.VisibilityType.VISIBILITY_TYPE_PUBLIC, enableLight: true, ledLightColor: Color.RED }; await notificationManager.addSlot(slot); console.info(通知渠道创建成功); } catch (error) { console.error(创建通知渠道失败:, error); } }5.2 发布普通文本通知import { notificationManager } from kit.NotificationKit; import { BusinessError } from kit.BasicServicesKit; // 发布普通文本通知 async function publishTextNotification(): Promisevoid { try { const notificationRequest: notificationManager.NotificationRequest { id: 1, slotId: slot_001, content: { notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, normal: { title: 通知标题, text: 这是通知内容, additionalText: 附加信息 } }, badgeNumber: 1, autoDeletedTime: Date.now() 3000 // 3秒后自动删除 }; await notificationManager.publish(notificationRequest); console.info(文本通知发布成功); } catch (error) { console.error(发布通知失败:, error); } }5.3 发布图片通知import { notificationManager } from kit.NotificationKit; import { BusinessError } from kit.BasicServicesKit; import { image } from kit.ImageKit; // 发布图片通知 async function publishImageNotification(): Promisevoid { try { // 获取图片资源 const resourceManager getContext().resourceManager; const imageArray await resourceManager.getMediaContent($r(app.media.notification_icon).id); const imageResource image.createImageSource(imageArray.buffer); const imagePixelMap await imageResource.createPixelMap(); const notificationRequest: notificationManager.NotificationRequest { id: 2, slotId: slot_001, largeIcon: imagePixelMap, content: { notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_PICTURE, picture: { title: 图片通知, text: 这是一张图片通知, bigPicture: imagePixelMap } } }; await notificationManager.publish(notificationRequest); console.info(图片通知发布成功); } catch (error) { console.error(发布图片通知失败:, error); } }5.4 发布进度条通知import { notificationManager } from kit.NotificationKit; import { BusinessError } from kit.BasicServicesKit; import { request } from kit.NetworkKit; // 发布进度条通知 async function publishProgressNotification(): Promisevoid { try { const notificationRequest: notificationManager.NotificationRequest { id: 3, slotId: slot_001, content: { notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, normal: { title: 文件下载, text: 正在下载文件... } }, template: { name: downloadTemplate, data: { title: PDF文件下载, fileName: test.pdf, progressValue: 0 } } }; // 发布初始通知 await notificationManager.publish(notificationRequest); // 模拟下载进度更新 let progress 0; const interval setInterval(async () { progress 10; if (progress 100) { clearInterval(interval); return; } // 更新通知 notificationRequest.template!.data!.progressValue progress; notificationRequest.template!.data!.fileName test.pdf 下载进度: ${progress}%; await notificationManager.publish(notificationRequest); }, 1000); } catch (error) { console.error(发布进度通知失败:, error); } }5.5 带操作按钮的通知import { notificationManager } from kit.NotificationKit; import { BusinessError } from kit.BasicServicesKit; import { WantAgent } from kit.AbilityKit; // 发布带操作按钮的通知 async function publishActionNotification(): Promisevoid { try { // 创建WantAgent点击通知后要触发的意图 const wantAgentInfo: WantAgent.WantAgentInfo { wants: [ { bundleName: com.example.myapp, abilityName: MainAbility } ], actionType: WantAgent.OperationType.START_ABILITIES, requestCode: 0 }; const wantAgent await WantAgent.getWantAgent(wantAgentInfo); const notificationRequest: notificationManager.NotificationRequest { id: 4, slotId: slot_001, content: { notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, normal: { title: 带操作的通知, text: 点击查看详情或执行操作 } }, wantAgent: wantAgent, actionButtons: [ { title: 打开应用, wantAgent: wantAgent }, { title: 取消, wantAgent: { wants: [ { action: com.example.CANCEL_ACTION } ], actionType: WantAgent.OperationType.SEND_COMMON_EVENT } } ] }; await notificationManager.publish(notificationRequest); console.info(带操作按钮的通知发布成功); } catch (error) { console.error(发布带操作通知失败:, error); } }5.6 取消通知import { notificationManager } from kit.NotificationKit; import { BusinessError } from kit.BasicServicesKit; // 取消指定通知 async function cancelNotification(): Promisevoid { try { await notificationManager.cancelNotification(1); console.info(通知取消成功); } catch (error) { console.error(取消通知失败:, error); } } // 取消所有通知 async function cancelAllNotifications(): Promisevoid { try { await notificationManager.cancelAllNotifications(); console.info(所有通知取消成功); } catch (error) { console.error(取消所有通知失败:, error); } }5.7 权限申请在发布通知前需要申请通知权限import { notificationManager } from kit.NotificationKit; import { BusinessError } from kit.BasicServicesKit; // 请求通知权限 async function requestNotificationPermission(): Promisevoid { try { await notificationManager.requestEnableNotification(); console.info(通知权限申请成功); } catch (error) { if (error.code 1600004) { console.info(用户拒绝了通知权限); } else { console.error(请求通知权限失败:, error); } } }六、综合实战跨设备文件传输6.1 场景描述用户在手机上启动文件发送操作将大文件发送到同一账号下的平板电脑。平板上的文件传输应用在后台订阅自定义公共事件当文件传输完成后手机应用发布公共事件平板应用接收事件并处理文件最后通过通知告知用户。6.2 代码实现手机端发送方import commonEvent from ohos.commonEventManager; import { notificationManager } from kit.NotificationKit; import { BusinessError } from kit.BasicServicesKit; // 文件传输完成后发布公共事件 async function publishFileTransferComplete(filePath: string): Promisevoid { try { const options: commonEvent.CommonEventPublishData { code: 200, data: JSON.stringify({ filePath: filePath, fileName: test.pdf, fileSize: 10MB, transferTime: new Date().toISOString() }), isOrdered: true }; await commonEvent.publish(com.example.FILE_TRANSFER_COMPLETE, options); console.info(文件传输完成事件发布成功); // 发送本地通知 await publishTransferCompleteNotification(); } catch (error) { console.error(发布文件传输事件失败:, error); } } // 发布传输完成通知 async function publishTransferCompleteNotification(): Promisevoid { try { const notificationRequest: notificationManager.NotificationRequest { id: 1001, slotId: slot_transfer, content: { notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, normal: { title: 文件传输完成, text: 文件已成功发送到平板设备 } } }; await notificationManager.publish(notificationRequest); } catch (error) { console.error(发布通知失败:, error); } }平板端接收方import commonEvent from ohos.commonEventManager; import { notificationManager } from kit.NotificationKit; import { BusinessError } from kit.BasicServicesKit; // 订阅文件传输完成事件 async function subscribeFileTransferEvent(): Promisevoid { try { const subscribeInfo { events: [com.example.FILE_TRANSFER_COMPLETE] }; const subscriber await commonEvent.createSubscriber(subscribeInfo); commonEvent.subscribe(subscriber, async (err: BusinessError, data: commonEvent.CommonEventData) { if (err) { console.error(订阅失败: ${err.code}, ${err.message}); return; } // 解析事件数据 const eventData JSON.parse(data.data as string); console.info(收到文件传输完成事件:, eventData); // 处理文件 await handleFileTransfer(eventData); }); } catch (error) { console.error(创建订阅者失败:, error); } } // 处理文件传输 async function handleFileTransfer(eventData: any): Promisevoid { try { // 模拟文件处理逻辑 console.info(开始处理文件: ${eventData.fileName}); // 模拟文件处理耗时 await new Promise(resolve setTimeout(resolve, 2000)); console.info(文件处理完成); // 发送处理完成通知 await publishFileProcessedNotification(eventData.fileName); } catch (error) { console.error(处理文件失败:, error); } } // 发布文件处理完成通知 async function publishFileProcessedNotification(fileName: string): Promisevoid { try { const notificationRequest: notificationManager.NotificationRequest { id: 2001, slotId: slot_transfer, content: { notificationContentType: notificationManager.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT, normal: { title: 文件接收完成, text: ${fileName} 已保存至下载文件夹 } } }; await notificationManager.publish(notificationRequest); console.info(文件处理完成通知发布成功); } catch (error) { console.error(发布通知失败:, error); } }七、调试与优化7.1 调试工具HarmonyOS提供了调试助手工具帮助开发者调试公共事件和通知CEM调试助手用于调试公共事件ANM调试助手用于调试通知7.2 性能优化建议合理使用公共事件避免频繁发布不必要的事件减少系统负担及时退订事件在不需要时及时退订公共事件避免内存泄漏优化通知频率避免过于频繁的通知影响用户体验使用适当的重要级别根据通知内容的重要性选择合适的通知级别处理权限拒绝优雅处理用户拒绝通知权限的情况八、总结与最佳实践8.1 核心要点回顾公共事件机制实现应用间后台通信支持系统事件和自定义事件通知机制向用户提供可视化的消息提醒支持多种样式和交互跨设备协同通过公共事件实现设备间的数据同步和状态感知权限管理合理申请和使用所需权限确保应用正常运行8.2 最佳实践场景选择 需要后台通信时使用公共事件 需要用户交互时使用通知 需要跨设备协同时结合使用两者权限申请 在module.json5中声明所需权限 运行时动态请求用户授权 优雅处理权限拒绝的情况性能优化 避免频繁发布事件和通知 及时清理不再需要的订阅和通知 使用适当的事件类型和通知级别用户体验 提供清晰的通知内容 支持通知操作按钮 合理控制通知频率通过合理运用公共事件与通知机制可以构建出响应迅速、体验流畅的HarmonyOS应用实现真正的跨设备协同体验。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

做壁纸壁的网站有什么区别如何攻克网站

影子寄存器的核心作用是通过双缓冲机制确保硬件外设(如定时器、PWM模块)的关键参数更新同步且稳定,避免时序混乱和信号毛刺。具体作用包括:1. 同步更新允许程序员在预装载寄存器中准备新值(如定时器周期值ARR、分频系数…

张小明 2026/1/13 17:36:35 网站建设

怎么修改网站上的内容网站建设属于什么行业类别

第一章:环境Agent监测频率的核心挑战在现代分布式系统中,环境Agent承担着采集节点状态、资源利用率和运行时指标的关键职责。监测频率的设定直接影响系统性能与数据实时性之间的平衡。过高频率会加剧网络负载并消耗大量计算资源,而过低则可能…

张小明 2026/1/13 17:30:32 网站建设

响应式网站企业深圳公司名称核准查询

KDDockWidgets 终极指南:打造专业级 Qt 停靠界面 【免费下载链接】KDDockWidgets KDABs Dock Widget Framework for Qt 项目地址: https://gitcode.com/gh_mirrors/kd/KDDockWidgets 想要为你的 Qt 应用程序打造专业级的停靠界面吗?KDDockWidgets…

张小明 2026/1/13 17:28:31 网站建设

做暧暧视频免费视频网站济南突然宣布

人脸解析模型实用指南:完整解决方案与故障排除 【免费下载链接】face-parsing 项目地址: https://ai.gitcode.com/hf_mirrors/jonathandinu/face-parsing 人脸解析技术通过深度学习方法精确分割面部特征,为美颜滤镜、虚拟试妆、表情分析等应用提…

张小明 2026/1/13 17:26:30 网站建设

天河建网站wordpress强大主题

本期目标 理清本工程系统框架 弄懂CubeMx配置相关原理及设置的背后含义 梳理代码设计流程 SAR型 ADC 单片机里的ADC,一般都是SAR型 ADC,是逐次逼近型ADC 吗这种类型的ADC精度一般都不是很高 ,但是成本都比较低 CubeMx配置 DMA设置 对D…

张小明 2026/1/13 17:24:29 网站建设

类似建E网模型网站建设福州外贸网站制作

无 sFTP 不意味着无加密:lftp 实用指南(上) 在当今,远程访问类 Unix 服务器大多通过 SSH(安全外壳协议)来实现。SSH 极为流行,以至于很少会出现不使用它,而改用 Telnet 客户端的情况。就个人而言,我很少使用 SCP(安全复制协议),而是在大多数手动文件传输中使用 sF…

张小明 2026/1/13 17:22:28 网站建设