HarmonyOS7 分布式流转:手机到平板无缝接续案例

文章目录

前言

"我在手机上看视频,躺到沙发上拿起平板,视频自动续上"------这种跨设备接续就是分布式流转(Continuation)。

上篇文章讲了数据同步原理,这篇直接上一个可感知的实战案例:把手机上正在看的页面,一键"流转"到平板继续。重点讲清楚"流转"和"数据同步"的区别,以及怎么实现。

流转 vs 同步,别搞混

概念 含义 例子
数据同步 数据在多处都存在 备忘录多端可见
流转(接续) 任务从 A 设备"搬"到 B 设备 手机看视频→平板接着看

流转的核心是:当前任务状态迁移到另一台设备,原设备退出。不是复制,是"搬家"。

流转能做什么

典型场景:

  • 视频/音乐播放位置接续
  • 导航从手机转到车机
  • 文档编辑从手机转到平板
  • 游戏从手机转到智慧屏

本质是"把当前的页面 + 状态,交给另一台设备重建"。

实现思路(以页面流转为例)

流转 API 围绕 continuationManager(流转管理)展开。核心三步:

第一步:注册可流转能力

在 Ability 里声明自己支持流转,并注册回调:

代码实现

typescript 复制代码
import { continuationManager } from '@kit.DeviceAwarenessKit'

// 在 Ability 的 onContinue 里,把要带走的状态打包
onContinue(wantParam: Record<string, Object>) {
  // 把当前播放进度、页面参数写进 wantParam
  wantParam['playPosition'] = this.currentPosition
  wantParam['videoId'] = this.videoId
  return { resultCode: 0, wantParam }
}
  • onContinue 在流转发起时被调,你往 wantParam 里塞"需要带走的状态"(如播放进度)。
  • 这一步等于告诉系统:"要搬走的话,带上这些状态"。

第二步:发起流转(选设备)

核心代码

typescript 复制代码
continuationManager.startContinuationDeviceChooser(
  getContext(),
  // 用户选了目标设备后的回调
  (deviceId: string) => {
    console.info('用户选择流转到设备:' + deviceId)
  }
)
  • 系统弹出"可选设备"列表(同账号互信设备)。
  • 用户选一个,触发流转。

第三步:目标设备重建

目标设备的同名 Ability 收到 wantParam,在 onCreate/onNewWant 里取出状态,恢复界面:

完整示例

typescript 复制代码
onNewWant(want: Want) {
  const pos = want.parameters?.['playPosition'] as number
  this.currentPosition = pos        // 用传来的进度续播
  this.startPlayFrom(pos)
}

关键点总结

  1. 流转 = "状态打包带走 + 目标重建",不是简单同步。
  2. 必须同一账号 + 互信设备,否则选不到设备。
  3. 要带走的只有"必要状态"(进度、ID),别把整个大对象塞进去。
  4. 原设备流转后通常要主动 finish() 退出,避免两端同时跑。

常见误区(小白必踩)

误区 说明
把流转当同步 流转是"任务搬家"(原设备退出、目标重建),不是数据多端共存,两码事。
不带必要状态 只带 videoId 不带 playPosition,目标设备没法续播。
原设备不 finish() 流转后两端同时跑,应该原设备退出。
选不到设备 检查是否同账号、已互信。

下面这段代码可以直接复制到 DevEco Studio 里运行。建议你边读边敲,改一改文末「动手改一改」里的参数,亲眼看看效果。

完整可运行示例:分布式流转

把正在看的页面「流转」到平板继续。

代码解析

typescript 复制代码
// 流转:把当前任务无缝迁移到附近设备
import { continuationManager } from '@kit.ContinuousTaskKit'

@Entry
@Component
struct Continuation {
  @State tip: string = '在手机上阅读'
  build() {
    Column({ space: 16 }) {
      Text(this.tip).fontSize(20)
      Button('流转到平板').onClick(() => {
        continuationManager.startContinuation({
          deviceId: 'target-device-id',
          // 目标设备拉起同页面并带入当前状态
          want: { bundleName: 'com.example.app', abilityName: 'ReaderAbility' }
        })
        this.tip = '已流转到平板,继续阅读'
      })
    }.padding(20)
  }
}

你会看到什么:点按钮后,当前阅读进度被带到平板,平板自动打开同一页面并定位到相同位置,手机端提示已流转。

动手改一改:

  • 用 continuationManager.on('deviceConnect') 自动发现附近设备。
  • 把要流转的状态序列化成 want.parameters 传递。
  • 在目标设备 onNewWant 里恢复状态。

写在最后

流转听着玄乎,拆开就三步:onContinue 打包状态 → 选设备发起 → 目标 onNewWant 重建。它解决的是"任务搬家",和"数据多端共存"是两套思路,别混。

想练手,从"视频进度流转"做起最直观:手机暂停时记进度,流转到平板后用进度续播------用户能立刻感知到"哇,真的续上了"。

相关推荐
XMAIPC_Robot17 小时前
NXP i.MX95 + FPGA 异构计算平台 — 工业多域融合 AI 加速嵌入式控制解决方案
人工智能·分布式·fpga开发·能源·rk3576+fpga
方方洛1 天前
ray教程-13-RayTrain与分布式训练
人工智能·分布式·机器学习
黄俊懿2 天前
【架构师从入门到进阶】第七章:缓存和存储的优化思路——第一节:缓存概述
数据结构·数据库·分布式·缓存·架构·系统架构·1024程序员节
红海云2 天前
两台DGX Spark部署DeepSeek的实战边界
大数据·分布式·spark
GlobalInfo2 天前
上新 | 全球及中国起重机摄像系统行业研究报告(2026版):市场现状、行业前景与占有率分析
大数据·分布式·微服务·ai·相机
方方洛2 天前
ray教程-11-可观测性与调试
人工智能·分布式·机器学习
samforce3 天前
为什么微服务会退化成“分布式单体”?——软件架构里的嵌套率传导定律
人工智能·分布式·微服务·架构·软件架构·结构认知
每天一道题3 天前
Kafka 是如何工作的?从 Broker、Partition、Offset 到 Consumer Group
分布式·kafka
用户1494484813203 天前
为什么大厂很少直接用 2PC/TCC?聊聊分布式事务在真实业务里的落地套路
分布式·后端
code_slave(码畜)4 天前
微服务架构落地:分库分表实战(下) —— 分布式主键、跨分片查询与分页聚合防坑
数据库·spring boot·分布式·spring cloud·微服务·架构·分库分表