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

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

相关推荐
一只积极向上的小咸鱼1 小时前
多机Docker + InfiniBand 分布式运行实操手册
分布式·docker·容器
AndrewHZ2 小时前
【LLM技术全景】混合精度与分布式训练:训练大模型的工程奥秘
人工智能·分布式·深度学习·算法·ai·语言模型·llm
ffqws_10 小时前
Redis 分布式锁:基于 Redisson 的实现与面试高频问答
redis·分布式·面试
大师兄666811 小时前
HarmonyOS7 音视频播放:AVPlayer 实战
音视频·avplayer·harmonyos7
六bring个六16 小时前
open Harmony中分布式软总线的学习任务清单
分布式·学习·c/c++·open harmony
wuqingshun31415916 小时前
说一下 Kafka 中关于事务消息的实现?
分布式·kafka
大师兄666818 小时前
HarmonyOS7 手势系统:Tap/LongPress/Pan 组合拳
手势·longpress·harmonyos7
名字还没想好☜21 小时前
用 Redis + Redisson 实现分布式锁:从踩坑到生产可用
java·redis·分布式·junit·分布式锁·redisson
董可伦1 天前
Spark 源码 | SparkSubmitArguments 参数解析(三)
大数据·分布式·spark