概述
在用户使用设备的过程中,当使用情境发生变化时(例如从室内走到户外或者周围有更适合的设备等),之前使用的设备可能已经不适合继续当前的任务,此时,用户可以选择新的设备来继续当前的任务,原设备可按需决定是否退出任务,这个就是跨端迁移的场景。常见的跨端迁移场景实例:在平板上播放的视频,迁移到智慧屏继续播放,从而获得更佳的观看体验;平板上的视频应用退出。在应用开发层面,跨端迁移指在A端运行的UIAbility迁移到B端上,完成迁移后,B端UIAbility继续任务,而A端UIAbility可按需决定是否退出。
跨端迁移的核心任务是将应用的当前状态(包括页面控件、状态变量等)无缝迁移到另一设备,从而在新设备上无缝接续应用体验。这意味着用户在一台设备上进行的操作可以在另一台设备的相同应用中快速切换并无缝衔接。
主要功能包括:
-
支持用户自定义数据存储及恢复。
-
支持页面路由信息和页面控件状态数据的存储及恢复。
-
支持应用兼容性检测。
-
支持应用根据实际使用场景动态设置迁移状态(默认迁移状态为 ACTIVE 激活状态)。例如,编辑类应用在编辑文本的页面下才需要迁移,其他页面不需要迁移,则可以通过
setMissionContinueState
进行控制。 -
支持应用动态选择是否进行页面栈恢复(默认进行页面栈信息恢复)。例如,应用希望自定义迁移到其他设备后显示的页面,则可以通过
SUPPORT_CONTINUE_PAGE_STACK_KEY
进行控制。 -
支持应用动态选择迁移成功后是否退出迁移源端应用(默认迁移成功后退出迁移源端应用)。可以通过
SUPPORT_CONTINUE_SOURCE_EXIT_KEY
进行控制。
说明:
开发者可以开发具有迁移能力的应用,迁移的触发由系统应用完成。
运作机制
- 在源端,通过
UIAbility
的onContinue()
回调,开发者可以保存待接续的业务数据。例如,在浏览器应用中完成跨端迁移,开发者需要使用onContinue()
回调保存页面URL等业务内容,而系统将自动保存页面状态,如当前浏览进度。 - 分布式框架提供了跨设备应用界面、页面栈以及业务数据的保存和恢复机制,它负责将数据从源端发送到对端。
- 在对端,同一
UIAbility
可以通过onCreate()
(冷启动)和onNewWant()
(热启动)接口来恢复业务数据。
约束限制
- 跨端迁移要求在同一
UIAbility
之间进行,也就是需要相同的bundleName
、abilityName
和签名信息。 - 为了获得最佳体验,使用
wantParam
传输的数据需要控制在100KB以下。
开发步骤
- 在 module.json5配置文件 的abilities标签中配置跨端迁移标签
continuable
。
{
"module": {
// ...
"abilities": [
{
// ...
"continuable": true, // 配置UIAbility支持迁移
}
]
}
}
说明:
根据需要配置应用启动模式类型,配置详情请参照 UIAbility组件启动模式。
-
在源端
UIAbility
中实现onContinue()
回调。当
UIAbility
实例触发迁移时,onContinue()
回调在源端被调用,开发者可以在该接口中通过同步或异步的方式来保存迁移数据,实现应用兼容性检测,决定是否支持此次迁移。- 保存迁移数据:开发者可以将要迁移的数据通过键值对的方式保存在
wantParam
参数中。 - 应用兼容性检测:开发者可以通过从
wantParam
参数中获取对端应用的版本号与源端应用版本号做兼容性校验。开发者可以在触发迁移时从onContinue()
回调中wantParam.version
获取到迁移对端应用的版本号与迁移源端应用版本号做兼容校验。 - 迁移决策:开发者可以通过
onContinue()
回调的返回值决定是否支持此次迁移。
- 保存迁移数据:开发者可以将要迁移的数据通过键值对的方式保存在
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import hilog from '@ohos.hilog';
import UIAbility from '@ohos.app.ability.UIAbility';
const TAG: string = '[MigrationAbility]';
const DOMAIN_NUMBER: number = 0xFF00;
export default class MigrationAbility extends UIAbility {
onContinue(wantParam: Record<string, Object>):AbilityConstant.OnContinueResult {
let version = wantParam.version;
let targetDevice = wantParam.targetDevice;
hilog.info(DOMAIN_NUMBER, TAG, `onContinue version = ${version}, targetDevice: ${targetDevice}`); // 准备迁移数据
// 获取源端版本号
let versionSrc: number = -1; // 请填充具体获取版本号的代码
// 兼容性校验
if (version !== versionSrc) {
// 在兼容性校验不通过时返回MISMATCH
return AbilityConstant.OnContinueResult.MISMATCH;
}
// 将要迁移的数据保存在wantParam的自定义字段(例如data)中
const continueInput = '迁移的数据';
wantParam['data'] = continueInput;
return AbilityConstant.OnContinueResult.AGREE;
}
}
-
源端设备
UIAbility
实例在冷启动和热启动情况下分别会调用不同的接口来恢复数据和加载UI。
在对端设备的UIAbility
中,需要实现onCreate()
/onNewWant()
接口来恢复迁移数据。通过在
onCreate()
/onNewWant()
回调中检查launchReason
,可以判断此次启动是否有迁移触发。开发者可以从want
中获取之前保存的迁移数据,并在数据恢复后调用restoreWindowStage()<