文章目录
-
- 前言
- [流转 vs 同步,别搞混](#流转 vs 同步,别搞混)
- 流转能做什么
- 实现思路(以页面流转为例)
- 关键点总结
- 常见误区(小白必踩)
- 完整可运行示例:分布式流转
- 写在最后
前言
"我在手机上看视频,躺到沙发上拿起平板,视频自动续上"------这种跨设备接续就是分布式流转(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)
}
关键点总结
- 流转 = "状态打包带走 + 目标重建",不是简单同步。
- 必须同一账号 + 互信设备,否则选不到设备。
- 要带走的只有"必要状态"(进度、ID),别把整个大对象塞进去。
- 原设备流转后通常要主动
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 重建。它解决的是"任务搬家",和"数据多端共存"是两套思路,别混。
想练手,从"视频进度流转"做起最直观:手机暂停时记进度,流转到平板后用进度续播------用户能立刻感知到"哇,真的续上了"。