尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

《HarmonyOS 7 精准碰一碰跨设备协作开发实战》05:从文件投递到跨设备业务指令协同【鸿蒙心迹】

发布时间:2026/9/27 3:39:02

资讯中心
01
ARTICLE

《HarmonyOS 7 精准碰一碰跨设备协作开发实战》05:从文件投递到跨设备业务指令协同【鸿蒙心迹】

《HarmonyOS 7 精准碰一碰跨设备协作开发实战》05:从文件投递到跨设备业务指令协同【鸿蒙心迹】
前面都是传文件这次升级一下手机碰PC左边是加素材碰中间是插画布碰右边是换预览。同一个资源不同位置不同动作。前四篇我们解决了传什么、传到哪、怎么传不乱。这一篇解决一个更有意思的问题传过去以后干什么我之前测的时候手机上一张图碰PC左边素材栏图片加进去了碰中间画布图片也加进去了碰右边预览窗口图片还是加进去了。不对啊——这三个地方应该有不同动作才对。碰左边应该是添加到素材库。碰中间应该是插入到当前画布。碰右边应该是替换预览内容。但我之前的代码不管碰哪里都是同一个处理存URI、加列表。问题出在哪我只传了文件没传业务指令。一、传输层和业务层要分开很多人做跨设备分享容易犯一个错把传文件和怎么处理文件写在一个回调里。接收回调一进来立刻if/else判断是哪个区域然后直接调对应的业务方法。短代码看着挺爽但业务一多就炸了。比如现在有3个区域对应3个动作。以后加了一个碰图层面板要插入到指定图层你又得在回调里加一个if。再加一个碰导出按钮要导出当前资源再加一个if。回调变成了if/else大杂烩谁都不敢动。正确的做法是分两层传输层只负责把数据传过来不关心怎么处理。业务层收到数据后根据指令分发到不同处理器。中间用一个统一的Payload把业务信息封装起来。二、CrossDevicePayload统一传输协议我们定义一个统一的数据结构CrossDevicePayload。它不只装URI还要装resourceId资源唯一标识action要执行什么动作target目标区域sourceDevice来源设备timestamp时间戳params业务参数这样接收端收到后根据action字段分发到不同的业务处理器。这段代码解决什么问题统一跨设备传输协议。文件protocol/CrossDevicePayload.ets用途封装传输数据和业务指令接入位置发送端组装、接收端解析enumCrossAction{ADD_TO_MATERIALadd_material,// 添加到素材库INSERT_CANVASinsert_canvas,// 插入画布REPLACE_PREVIEWreplace_preview,// 替换预览EXPORT_RESOURCEexport_resource// 导出资源}interfaceCrossDevicePayload{resourceId:string;uri:string;action:CrossAction;target:string;sourceDevice:string;timestamp:number;params:Recordstring,string;}// 发送端组装functionbuildPayload(action:CrossAction,uri:string,target:string):CrossDevicePayload{return{resourceId:Date.now().toString(),uri:uri,action:action,target:target,sourceDevice:phone_deviceInfo.getDeviceId(),timestamp:Date.now(),params:{}};}三、业务分发器不要在回调里写if/else有了Payload接收端就不需要在回调里写一堆if了。我们做一个BusinessDispatcher——业务分发器。它维护一个映射表action对应哪个处理器。接收回调只做一件事解析Payload然后调dispatcher.dispatch(payload)。具体怎么处理dispatcher自己找对应的处理器。这段代码解决什么问题业务指令分发。文件dispatcher/BusinessDispatcher.ets用途根据action分发到不同处理器接入位置接收数据后调用classBusinessDispatcher{privatehandlers:MapCrossAction,(payload:CrossDevicePayload)voidnewMap();// 注册处理器register(action:CrossAction,handler:(payload:CrossDevicePayload)void){this.handlers.set(action,handler);}// 分发dispatch(payload:CrossDevicePayload){lethandlerthis.handlers.get(payload.action);if(handler){console.info(执行动作payload.action);handler(payload);}else{console.warn(未知动作payload.action);}}}// 使用letdispatchernewBusinessDispatcher();dispatcher.register(CrossAction.ADD_TO_MATERIAL,(payload){materialService.addResource(payload.uri);});dispatcher.register(CrossAction.INSERT_CANVAS,(payload){canvasService.insertImage(payload.uri,payload.params.x,payload.params.y);});dispatcher.register(CrossAction.REPLACE_PREVIEW,(payload){previewService.setSource(payload.uri);});四、为什么要这么分你可能会问我直接在回调里写if/else不也能跑吗能跑但有三个问题第一个问题耦合。传输逻辑和业务逻辑绑死了。你以后换个传输方式比如从碰一碰换成WiFi直连还得把业务代码抄一遍。第二个问题扩展。加新动作就得改接收回调。回调越改越大最后变成几千行的大函数。第三个问题测试。业务处理器是独立函数可以单独测试。混在回调里你得模拟整个传输流程才能测业务逻辑。分开以后传输层只管传数据业务层只管处理数据各干各的。第五篇总结跨设备分享协议和业务协议应该解耦。传输层只负责把数据传过来业务层根据action字段分发到不同处理器。不要把所有if/else堆在接收回调里那样业务一多就乱套了。工程上最容易翻车的是把传文件和怎么处理文件混在一起。分开以后加新动作只需要注册一个新处理器不用动传输逻辑。下一篇升级到多设备并发一台手机同时发给多台设备怎么保证互不影响。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。