鸿蒙 自由流转:应用跨设备衔接(二)
一、应用衔接
应用衔接指当用户在一个设备上操作某个应用时,可以在另一个设备的相同应用中快速切换,无缝衔接上一个设备的应用体验。
场景:在手机上编辑备忘录,到办公室后切换到电脑上继续编辑,完成任务的无缝衔接。
鸿蒙系统底层解决了应用接续过程中设备发现、连接、组网等过程繁琐的开发难点,应用在接入时仅需关注数据的传输和恢复。
二、限制
2.1 设备版本限制
| 限制 | 说明 |
|---|---|
| 设备版本 | HarmonyOS NEXT Developer Preview0及以上版本 |
| 模拟器 | 暂不支持 |
2.2 使用限制
| 限制 | 说明 |
|---|---|
| 账号要求 | 双端设备需要登录同一华为账号 |
| 网络要求 | 双端设备需要打开WLAN和蓝牙开关,或在设置中启用“多设备协同增强服务” |
| 功能开关 | 双端设备需在设置中开启“多设备协同 → 接续”功能 |
| 应用安装 | 双端设备都需要安装该应用 |
| 数据量 | onContinue回调中使用wantParam传输的数据需控制在100KB以下,大数据量使用分布式对象迁移 |
2.3 权限说明(API11及以前)
API12起,无需申请ohos.permission.DISTRIBUTED_DATASYNC权限。API11及以前需要声明该权限并向用户申请授权。
三、建议
应用接续一般用于用户长时间停留的页面,默认情况下,应用接续完成后,源端应用会自动退出。
| 垂类 | 场景 | 发起接续页面与接续同步内容 | 接续完成后源端应用退出方案 |
|---|---|---|---|
| 工具 | 备忘录、笔记、日历、邮箱、浏览器 | 详情页,浏览/编辑进度同步 | 退出 |
| 出行导航 | 地图服务 | 路线查询、导航界面 | 退出 |
| 影音娱乐 | 视频/音乐/直播 | 播放进度同步 | 按需适配 |
| 新闻阅读 | 电子书/新闻 | 阅读进度同步 | 退出(听书类可不退出仅暂停) |
| 办公 | 会议 | 当前会议同步 | 不退出应用,仅退出会议 |
| 社交通讯 | 社交媒体平台 | 浏览及编辑进度同步 | 按需适配 |
| 拍摄美化 | 图片/视频编辑 | 编辑内容及进度同步 | 退出 |
四、运作机制
源端:onContinue()保存业务数据
↓
分布式框架:跨设备发送数据
↓
对端:onCreate()/onNewWant()恢复业务数据
五、主要接口
| 接口 | 描述 |
|---|---|
onContinue(wantParam) |
接续源端在该回调中保存迁移数据,返回AGREE/REJECT/MISMATCH |
onCreate(want, launchParam) |
接续目的端冷启动或多实例应用热启动时,恢复数据 |
onNewWant(want, launchParam) |
接续目的端单实例应用热启动时,恢复数据 |
onContinue返回值说明:
| 返回值 | 说明 |
|---|---|
AGREE |
同意迁移 |
REJECT |
拒绝迁移(如onContinue中异常) |
MISMATCH |
版本不匹配,无法迁移 |
六、开发步骤
6.1 启用应用接续能力
在module.json5文件的abilities中,将continuable标签配置为true。
{
"module": {
"abilities": [
{
"continuable": true
}
]
}
}
6.2 源端保存迁移数据
export default class EntryAbility extends UIAbility {
onContinue(wantParam: Record<string, Object>) {
// 检测对端应用版本兼容性
const targetVersion = wantParam.version;
const versionThreshold: number = 1000;
if (targetVersion < versionThreshold) {
// 版本不匹配,提示用户
return AbilityConstant.OnContinueResult.MISMATCH;
}
// 保存迁移数据
const continueInput = AppStorage.get('entryAbilityContext') as string;
if (continueInput) {
wantParam['data'] = continueInput;
}
return AbilityConstant.OnContinueResult.AGREE;
}
}
6.3 对端恢复数据
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
if (launchParam.launchReason === AbilityConstant.LaunchReason.CONTINUATION) {
// 设置迁移状态为ACTIVE
this.context.setMissionContinueState(AbilityConstant.ContinueState.ACTIVE);
// 恢复迁移数据
if (want.parameters !== undefined) {
if (typeof want.parameters.data === 'string') {
AppStorage.setOrCreate('entryAbilityContext', want.parameters.data);
}
}
// 恢复页面栈
this.context.restoreWindowStage(new LocalStorage());
}
}
}
注意:restoreWindowStage(this.storage)必须在同步接口方法中执行,不能在异步回调中执行。
七、可选配置
7.1 支持同应用中不同Ability跨端迁移
在module.json5中配置continueType字段,需要迁移的两个Ability的continueType取值必须保持一致。
{
"abilities": [
{
"continuable": true,
"continueType": ["continueType1"]
}
]
}
7.2 支持同应用不同BundleName的Ability跨端迁移
在module.json5中配置continueBundleName字段,添加对端应用的BundleName。
{
"abilities": [
{
"continueType": ["continueType"],
"continueBundleName": ["com.demo.example2"]
}
]
}
7.3 支持不同开发者的应用跨端迁移
需要在AGC平台申请“接续服务”,配置接续应用的APP ID。
7.4 快速启动目标应用
在module.json5的continueType标签中添加"_ContinueQuickStart"后缀:
{
"abilities": [
{
"continueType": ["EntryAbility_ContinueQuickStart"]
}
]
}
配置后,用户发起接续时会立即收到PREPARE_CONTINUATION请求(提前拉起),随后收到CONTINUATION请求(正式接续)。
7.5 动态配置迁移能力
通过setMissionContinueState()接口动态控制迁移能力开关:
| 状态值 | 含义 |
|---|---|
ACTIVE |
应用当前可迁移能力开启 |
INACTIVE |
应用当前可迁移能力关闭 |
7.6 按需迁移页面栈
当前仅支持router路由的页面栈信息自动恢复,暂不支持navigation路由。
配置wantParam[SUPPORT_CONTINUE_PAGE_STACK_KEY]可控制是否进行页面栈恢复。
7.7 按需退出
配置wantParam[SUPPORT_CONTINUE_SOURCE_EXIT_KEY]可控制迁移成功后是否退出迁移源端应用。
八、核心点
| 要点 | 说明 |
|---|---|
| 核心接口 | onContinue(源端保存)、onCreate/onNewWant(对端恢复) |
| 配置标签 | continuable: true |
| 数据限制 | 100KB以下,大数据量使用分布式对象 |
| 迁移状态 | ACTIVE(可迁移)/ INACTIVE(不可迁移) |
| 版本要求 | HarmonyOS NEXT Developer Preview0+,暂不支持模拟器 |
开发流程
在module.json5中配置continuable: true
↓
源端实现onContinue保存数据
↓
对端实现onCreate/onNewWant恢复数据
↓
调用restoreWindowStage恢复页面栈
↓
(可选)配置continueType/continueBundleName/快速启动等
更多推荐





所有评论(0)