多端协同解决什么问题
手机上拍的照片,想在平板上接着修;出门用手机记的笔记,回家在智慧屏上接着看。传统做法是手动传文件、靠云盘中转。鸿蒙的分布式能力把这件事抹平:应用感知不到多台设备,只像在操作一台设备。
分布式的目标:让多设备协同对开发者透明,用户却能真切感到连贯。
这篇从文件到任务,把多端协同走一遍。
分布式技术栈总览
鸿蒙分布式能力分几层:分布式软总线负责发现与连接设备;分布式数据管理负责跨端数据同步;分布式文件负责跨端文件存取;跨端迁移与协同负责把一个页面或会话搬到另一台设备。底层由系统屏蔽,业务侧调接口即可。
分布式能力速查
- 软总线发现、连接附近设备。
- 分布式数据跨端数据库同步。
- 分布式文件跨端文件读写。
- 跨端迁移页面流转与接续。
发现与连接附近设备
协同的第一步是找到对方。分布式设备管理提供设备发现与连接接口:同一账号、同一局域网下的可信设备会被枚举出来。业务侧拿到设备列表,让用户选择要协同的那台,再建立连接。
const deviceList = deviceManager.getTrustedDeviceList()
deviceList.forEach(d => console.log(d.deviceName))
枚举出来的就是当前可信、可协同的设备。
分布式文件:跨设备存取
分布式文件系统把多台设备的存储连成一个统一命名空间。写入一个跨端路径,数据实际落在对端设备上,本地却像读写自己的文件。跨端大文件传输、相册共享都走这条路。
跨端数据流与状态同步
分布式数据对象把一份数据在多端绑定:一端改,另一端自动收到回调。适合协同编辑、状态共享。配合上一篇讲的状态管理,界面只需订阅数据,跨端更新会自动反映到界面。
任务接续:流转与会话
跨端迁移是把当前页面连同状态搬到另一台设备继续用。用户在手机上看到一半的文档,点流转,平板上打开同一个页面、同一段进度。迁移前要把需要的状态序列化好,对端恢复。
数据一致性与冲突
多端同时改同一份数据就会冲突。分布式数据系统按时间戳或版本号做合并,业务侧要定义好冲突策略——最后写入胜出,还是字段级合并。涉及财务这类强一致场景,要谨慎选择同步粒度。
- 先想清楚哪些数据需要跨端。
- 同步粒度越细,冲突处理越复杂。
- 弱一致场景用自动合并即可。
实战:把一张照片流转到平板
用户选一台平板,把本地照片写入分布式文件路径,平板应用监听该目录并展示。
const src = getContext().filesDir + "/photo.jpg"
const remote = distFile.getRemoteDir(tabletId) + "/inbox/photo.jpg"
distFile.copy(src, remote)
// 平板端监听 inbox 目录,新文件到达即刷新相册
手机写完,平板的相册自动多出这张照片。多端协同的价值就在这一瞬间——用户感觉是同一块屏幕在延伸,而不是两台设备。