第29章 HarmonyOs开发图解之 流转

HarmonyOS 学习系统 | 阶段四:专业精通期


学习目标

序号 能力
1 理解跨端迁移(Migration)与多端协同(Collaboration)的区别
2 掌握 IAbilityContinuation 接口的四个核心方法
3 能够实现完整的跨端迁移流程

核心图解

HarmonyOS 流转能力全景图

内容讲解

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
  • 学习分布式设备发现和连接管理
Logo

一站式 AI 云服务平台

更多推荐