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 重建。它解决的是"任务搬家",和"数据多端共存"是两套思路,别混。

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

相关推荐
YH行业报告分析3 小时前
2026年直流配电网市场结构性增长解析:分布式能源并网与智能电网升级驱动下的技术路线博弈
分布式·能源
剑胆琴心静水深流11 小时前
全栈之路6---web集成与呈现
前端·vue.js·spring boot·分布式·spring·前端框架·npm
KAIWEILIUCC16 小时前
Ray:高性能、易扩展的Python分布式计算框架
分布式·llm
一路向北finish19 小时前
《CentOS 7 搭建 Hadoop 3.3.6 分布式集群:NFS 共享方案完整实操》
linux·运维·hadoop·分布式·centos
天涯明月199320 小时前
Ray 架构解析——以动态任务图统一 AI 计算的分布式框架
大数据·人工智能·分布式·架构·ray
小张同学a.21 小时前
MooseFS 分布式存储实战指南:部署、运维与 Pacemaker+SBD 高可用落地
linux·运维·分布式·pacemaker·moosefs·sbd
BYSJMG1 天前
大数据毕业设计选题方向|【基于大数据的燃油消耗数据可视化与分析】Hadoop+PySpark+FP-Growth
大数据·hadoop·分布式·信息可视化·数据分析·课程设计
NJCloud2 天前
MooseFS 分布式存储部署与高可用架构实践
linux·运维·分布式·架构
zcmodeltech2 天前
钢铁冶金沙盘模型控制系统设计与实现:高炉-连铸-热轧多工序联动方案
分布式·stm32·单片机·嵌入式硬件·交互
肠畔码农2 天前
深度解密 Redis 分布式锁:从单机原子语义到集群架构博弈
redis·分布式·架构