第29章_HarmonyOs开发图解之 流转
·
第29章 HarmonyOs开发图解之 流转
HarmonyOS 学习系统 | 阶段四:专业精通期
学习目标
| 序号 | 能力 |
|---|---|
| 1 | 理解跨端迁移(Migration)与多端协同(Collaboration)的区别 |
| 2 | 掌握 IAbilityContinuation 接口的四个核心方法 |
| 3 | 能够实现完整的跨端迁移流程 |
核心图解

内容讲解
29.1 流转概述
流转(Continuation)是 HarmonyOS 最具特色的能力之一,分为两种模式:跨端迁移(A 端应用迁移到 B 端,A 端退出)和多端协同(多端同时运行,各司其职)。流转能力的底层依赖分布式任务调度、分布式安全和分布式软总线三大基础能力。
生活化类比:跨端迁移就像"换座位看电影"
你在手机上看电影看到一半,突然觉得屏幕太小,于是把"观影进度"迁移到智慧屏上继续看——手机上的 App 自动退出。这个过程的关键是
onSaveData()保存进度(“看到第 30 分钟”),onRestoreData()恢复进度。多端协同则像"乐队合奏"——手机当指挥棒(控制端),智慧屏当音响(显示端),各司其职同时运行。
29.2 跨端迁移核心实现
// MainAbility 实现 IAbilityContinuation 接口
public class MainAbility extends Ability implements IAbilityContinuation {
@Override
public boolean onStartContinuation() {
// 确认是否可以开始迁移(可弹窗让用户确认)
return true;
}
@Override
public boolean onSaveData(IntentParams saveData) {
// 保存需要迁移的数据(限制 200KB)
saveData.setParam("currentPosition", currentPosition);
saveData.setParam("score", scoreValue);
saveData.setParam("playerState", isPlaying);
return true;
}
@Override
public boolean onRestoreData(IntentParams restoreData) {
// 在目标设备上恢复数据
currentPosition = restoreData.getIntParam("currentPosition", 0);
scoreValue = restoreData.getIntParam("score", 0);
isPlaying = restoreData.getBooleanParam("playerState", false);
return true;
}
@Override
public void onCompleteContinuation(int result) {
// 迁移完成,通知源端
if (result == ABILITY_CONTINUE_SUCCESS) {
terminateAbility(); // 源端退出
}
}
// 触发迁移
private void migrateToRemote(String deviceId) {
continueAbility(deviceId);
}
}
29.3 多端协同
多端协同与跨端迁移不同,多端协同是多个设备同时运行各自的应用,通过分布式能力进行数据交换和控制。
// 多端协同:在远程设备上启动 Ability
Intent intent = new Intent();
Operation operation = new Intent.OperationBuilder()
.withDeviceId(targetDeviceId)
.withBundleName("com.example")
.withAbilityName("RemoteAbility")
.build();
intent.setOperation(operation);
startAbility(intent);
// 多端协同:连接远程 Service
Intent serviceIntent = new Intent();
serviceIntent.setOperation(new Intent.OperationBuilder()
.withDeviceId(targetDeviceId)
.withBundleName("com.example")
.withAbilityName("RemoteService")
.build());
connectAbility(serviceIntent, connectionCallback);
29.4 流转约束与安全机制
- 数据大小限制:跨端迁移数据不能超过 200KB
- 数据类型限制:仅支持基础类型和 Sequenceable 对象,不支持自定义对象和文件
- 账号要求:两个设备必须登录同一个华为账号
- 设备限制:流转任务管理服务仅手机/平板支持
- 安全机制:E2E 加密通道,确保"正确的人 + 正确的设备 + 正确地使用数据"
代码速查卡
| API | 功能 | 示例 |
|---|---|---|
onStartContinuation() |
确认是否可以开始迁移 | return true; |
onSaveData(saveData) |
保存迁移数据 | saveData.setParam("key", value) |
onRestoreData(restoreData) |
恢复迁移数据 | restoreData.getIntParam("key", 0) |
onCompleteContinuation(result) |
迁移完成回调 | terminateAbility(); |
continueAbility(deviceId) |
触发跨端迁移 | continueAbility(targetDeviceId) |
startAbility(intent) |
远程启动 Ability | 用于多端协同 |
与 Android/iOS 对比
| 特性 | HarmonyOS | Android | iOS |
|---|---|---|---|
| 跨端迁移 | IAbilityContinuation(原生支持) | 不支持(需自建) | Handoff(有限支持) |
| 多端协同 | 分布式任务调度 | 不支持 | 不支持 |
| 数据同步 | 分布式软总线 + E2E 加密 | 蓝牙/Wi-Fi 直连 | iCloud 同步 |
| 安全机制 | 分布式安全三要素 | 蓝牙配对 | Apple ID + iCloud |
| 生态支持 | 华为全场景设备 | 跨品牌有限 | Apple 生态内 |
⚠️ 踩坑回忆录
流转数据超过 200KB 直接失败了!
我在 onSaveData 里试图传一张图片的 Bitmap,结果迁移直接失败,没有任何错误提示。后来才看到文档里的限制:跨端迁移数据不能超过 200KB,且仅支持基础类型和 Sequenceable 对象,不支持自定义对象和文件。正确做法:传图片的话,先存到分布式文件系统,迁移时只传文件 URI。
还有一个容易忘的:两个设备必须登录同一个华为账号,否则流转任务管理服务找不到对端设备。我在测试时用两个不同账号的设备,怎么都触发不了流转面板,浪费了好几个小时。
必做实操任务
| 序号 | 任务 | 难度 |
|---|---|---|
| 1 | 实现一个简单应用的跨端迁移(传递文本数据) | 高 |
| 2 | 实现多端协同:手机发送消息到平板显示 | 高 |
| 3 | 实现迁移数据的 200KB 限制检查和友好提示 | 中 |
| 4 | 实现一个大文件的分布式文件迁移方案 | 高 |
| 5 | 实现一个支持跨端迁移的音乐播放器 | 高 |
学习检查清单
- 能说出跨端迁移和多端协同的区别
- 能实现 IAbilityContinuation 的四个核心方法
- 知道跨端迁移数据的 200KB 限制
- 知道迁移数据仅支持基础类型和 Sequenceable
- 知道两个设备必须登录同一华为账号
- 能使用 continueAbility 触发迁移
- 理解分布式安全的三要素
- 能实现多端协同的远程 Ability 启动
进阶方向
- 实现跨端迁移 + 分布式数据库的联合方案
- 探索流转任务管理服务的自定义 UI
- 学习分布式设备发现和连接管理
备必须登录同一华为账号 - 能使用 continueAbility 触发迁移
- 理解分布式安全的三要素
- 能实现多端协同的远程 Ability 启动
进阶方向
- 实现跨端迁移 + 分布式数据库的联合方案
- 探索流转任务管理服务的自定义 UI
- 学习分布式设备发现和连接管理
更多推荐

所有评论(0)