首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

鸿蒙OS中如何实现跨设备迁移?

01

分布式任务调度概述

在 HarmonyOS 中,分布式任务调度平台对搭载 HarmonyOS 的多设备构筑的“超级虚拟终端”提供统一的组件管理能力,为应用定义统一的能力基线、接口形式、数据结构、服务描述语言,屏蔽硬件差异;支持远程启动、远程调用、业务无缝迁移等分布式任务。

02

实现调度的约束与限制

远程调用 PA/FA,开发者需要在 Intent 中设置支持分布式的标记(例如:Intent.FLAG_ABILITYSLICE_MULTI_DEVICE 表示该应用支持分布式调度),否则将无法获得分布式能力。

开发者通过在 config.json 中的 reqPermissions 字段里添加权限申请,以获取跨设备连接的能力和分布式数据传输的权限:

分布式数据传输的权限:

三方应用使用权限:

系统应用使用权限:

另外还有三个获取分布式设备信息需要的权限:

注意:还需要在开发的时候,要在 Ability 里主动声明,要用到的权限。

FA(Feature Ability,Page 模板的 Ability)的调用支持启动和迁移行为,在进行调度时:

当启动 FA 时,需要开发者在 Intent 中指定对端设备的 deviceId、bundleName 和 abilityName。

FA 的迁移实现相同 bundleName 和 abilityName 的 FA 跨设备迁移,因此需要指定迁移设备的 deviceId。

03

实现场景介绍

下面以设备 A(本地设备)和设备 B(远端设备)为例,介绍下面我们要实现的场景:

设备 A 启动设备 B 的 FA:在设备 A 上通过本地应用提供的启动按钮,启动设备 B 上对应的 FA。

设备 A 的 FA 迁移至设备 B:设备 A 上通过本地应用提供的迁移按钮,将设备 A 的业务无缝迁移到设备 B 中。

设备 A 的 FA 迁移至设备 B,还可以实现主动撤回迁移。

04

具体实现前先了解要用的接口

启动远程 FA

startAbility(Intent intent)接口提供启动指定设备上 FA 和 PA 的能力,Intent 中指定待启动 FA 的设备 deviceId、bundleName 和 abilityName。

迁移 FA

continueAbility(String deviceId)接口提供将本地 FA 迁移到指定设备上的能力。

continueAbilityReversibly(String deviceId)接口提供将本地 FA 迁移到指定设备上的能力,这种迁移可撤回,reverseContinueAbility() 接口提供撤回迁移的能力。

05

实战远程启动 FA 页面

编程实现上面场景的界面

ability_main.xml:

button_bg.xml:

MigrationAbility 和 MigrationBackAbility:

ability_migration.xml:

ability_migration_back.xml 比 ability_migration.xml 多一个迁回按钮,另外主页上点击按钮跳转等,略...

使用分布式能力要求开发者在 Ability 对应的 config.json 中声明多设备协同访问的权限:

三方应用部署权限、分布式数据传输的权限、系统应用使用权限的申请:

声明分布式获取设备列表及设备信息的权限,如下所示:

对于三方应用还要求在实现 Ability 的代码中显式声明需要使用的权限。

为启动远程 FA 的按钮添加点击事件,获取设备信息,实现启动远程 FA 的能力。

06

实现业务在设备间无缝迁移

实战将设备 A 运行时的 FA 迁移到设备 B,实现业务在设备间无缝迁移。

MigrationAbility:

MigrationAbilitySlice:

此外,不同于启动行为,FA 的迁移还涉及到状态数据的传递。为此,继承的 IAbilityContinuation 接口为开发者提供迁移过程中特定事件的管理能力。通过自定义迁移事件相关的行为,最终实现对 Ability 的迁移。

主要以较为常用的两个事件,包括迁移发起端完成迁移的回调 onCompleteContinuation(int result) 以及接收到远端迁移行为传递数据的回调 onRestoreData(IntentParams restoreData)。

其他还包括迁移到远端设备的 FA 关闭的回调 onRemoteTerminated()、用于本地迁移发起时保存状态数据的回调 onSaveData(IntentParams saveData)和本地发起迁移的回调 onStartContinuation()。

07

请求回迁

设备 A 上的 Page 请求回迁。

系统回调设备 B 上 Page 及其 AbilitySlice 栈中所有 AbilitySlice 实例的 IAbilityContinuation.onStartContinuation() 方法,以确认当前是否可以立即迁移。

如果可以立即迁移,则系统回调设备 B 上 Page 及其 AbilitySlice 栈中所有 AbilitySlice 实例的 IAbilityContinuation.onSaveData() 方法,以便保存回迁后恢复状态必须的数据。

如果保存数据成功,则系统在设备 A 上 Page 恢复 AbilitySlice 栈,然后回调 IAbilityContinuation.onRestoreData() 方法,传递此前保存的数据。

如果数据恢复成功,则系统终止设备 B 上 Page 的生命周期。

专注开源技术,共建鸿蒙生态

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210104A0CT4L00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券