2024年鸿蒙最新HarmonyOS 应用开发之跨端迁移保姆级教程~(1),2024年最新HarmonyOS鸿蒙开发中常见的一些问题面试专题

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!


img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

跨端迁移的核心任务是将应用的当前状态(包括页面控件、状态变量等)无缝迁移到另一设备,从而在新设备上无缝接续应用体验。这意味着用户在一台设备上进行的操作可以在另一台设备的相同应用中快速切换并无缝衔接。

主要功能包括:

  • 支持用户自定义数据存储及恢复。
  • 支持页面路由信息和页面控件状态数据的存储及恢复。
  • 支持应用兼容性检测。
  • 支持应用根据实际使用场景动态设置迁移状态(默认迁移状态为 ACTIVE 激活状态)。例如,编辑类应用在编辑文本的页面下才需要迁移,其他页面不需要迁移,则可以通过 setMissionContinueState 进行控制。
  • 支持应用动态选择是否进行页面栈恢复(默认进行页面栈信息恢复)。例如,应用希望自定义迁移到其他设备后显示的页面,则可以通过 SUPPORT_CONTINUE_PAGE_STACK_KEY 进行控制。
  • 支持应用动态选择迁移成功后是否退出迁移源端应用(默认迁移成功后退出迁移源端应用)。可以通过 SUPPORT_CONTINUE_SOURCE_EXIT_KEY 进行控制。

说明:
开发者可以开发具有迁移能力的应用,迁移的触发由系统应用完成。

运作机制

  1. 在源端,通过UIAbilityonContinue() 回调,开发者可以保存待接续的业务数据。例如,在浏览器应用中完成跨端迁移,开发者需要使用 onContinue() 回调保存页面URL等业务内容,而系统将自动保存页面状态,如当前浏览进度。
  2. 分布式框架提供了跨设备应用界面、页面栈以及业务数据的保存和恢复机制,它负责将数据从源端发送到对端。
  3. 在对端,同一UIAbility可以通过 onCreate() (冷启动)和 onNewWant() (热启动)接口来恢复业务数据。

约束限制

  • 跨端迁移要求在同一UIAbility之间进行,也就是需要相同的bundleNameabilityName和签名信息。
  • 为了获得最佳体验,使用wantParam传输的数据需要控制在100KB以下。

开发步骤

  1. 在 module.json5配置文件 的abilities标签中配置跨端迁移标签continuable

{
“module”: {
// …
“abilities”: [
{
// …
“continuable”: true, // 配置UIAbility支持迁移
}
]
}
}

说明:

根据需要配置应用启动模式类型,配置详情请参照 UIAbility组件启动模式。

  1. 在源端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;
}
}

  1. 源端设备UIAbility实例在冷启动和热启动情况下分别会调用不同的接口来恢复数据和加载UI。
    在对端设备的UIAbility中,需要实现 onCreate() / onNewWant() 接口来恢复迁移数据。

通过在 onCreate() / onNewWant() 回调中检查launchReason,可以判断此次启动是否有迁移触发。开发者可以从want中获取之前保存的迁移数据,并在数据恢复后调用restoreWindowStage()来触发页面恢复,包括页面栈信息。

import AbilityConstant from ‘@ohos.app.ability.AbilityConstant’;
import hilog from ‘@ohos.hilog’;
import UIAbility from ‘@ohos.app.ability.UIAbility’;
import type Want from ‘@ohos.app.ability.Want’;

const TAG: string = ‘[MigrationAbility]’;
const DOMAIN_NUMBER: number = 0xFF00;

export default class MigrationAbility extends UIAbility {
storage : LocalStorage = new LocalStorage();

onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
hilog.info(DOMAIN_NUMBER, TAG, ‘%{public}s’, ‘Ability onCreate’);
if (launchParam.launchReason === AbilityConstant.LaunchReason.CONTINUATION) {
// 将上述保存的数据从want.parameters中取出恢复
let continueInput = ‘’;
if (want.parameters !== undefined) {
continueInput = JSON.stringify(want.parameters.data);
hilog.info(DOMAIN_NUMBER, TAG, continue input ${continueInput});
}
// 触发页面恢复
this.context.restoreWindowStage(this.storage);
}
}

onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
hilog.info(DOMAIN_NUMBER, TAG, ‘onNewWant’);
if (launchParam.launchReason === AbilityConstant.LaunchReason.CONTINUATION) {
// 将上述保存的数据从want.parameters中取出恢复
let continueInput = ‘’;
if (want.parameters !== undefined) {
continueInput = JSON.stringify(want.parameters.data);
hilog.info(DOMAIN_NUMBER, TAG, continue input ${continueInput});
}
// 触发页面恢复
this.context.restoreWindowStage(this.storage);
}
}
}

可选配置迁移能力

动态配置迁移能力

从API version 10开始,提供了支持动态配置迁移能力的功能。即应用可以根据实际使用场景,在需要迁移时开启应用迁移能力;在业务不需要迁移时则可以关闭迁移能力。

开发者可以通过调用 setMissionContinueState() 接口对迁移能力进行设置。默认状态下,应用的迁移能力为ACTIVE状态,即迁移能力开启,可以迁移。

设置迁移能力的时机

迁移能力的改变可以根据实际业务需求和代码实现,发生在应用生命周期的绝大多数时机。本文介绍常用的几种配置方式。

UIAbilityonCreate() 回调中调用接口,可以在应用创建时设置应用的迁移状态。

// MigrationAbility.ets
import AbilityConstant from ‘@ohos.app.ability.AbilityConstant’;
import hilog from ‘@ohos.hilog’;
import UIAbility from ‘@ohos.app.ability.UIAbility’;
import type Want from ‘@ohos.app.ability.Want’;

const TAG: string = ‘[MigrationAbility]’;
const DOMAIN_NUMBER: number = 0xFF00;

export default class MigrationAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// …
this.context.setMissionContinueState(AbilityConstant.ContinueState.INACTIVE, (result) => {
hilog.info(DOMAIN_NUMBER, TAG, setMissionContinueState: ${JSON.stringify(result)});
});
// …
}
}

在页面的onPageShow()回调中调用接口,可以设置单个页面出现时应用的迁移状态。

// Page_MigrationAbilityFirst.ets
import AbilityConstant from ‘@ohos.app.ability.AbilityConstant’;
import common from ‘@ohos.app.ability.common’;
import hilog from ‘@ohos.hilog’;

const TAG: string = ‘[MigrationAbility]’;
const DOMAIN_NUMBER: number = 0xFF00;

@Entry
@Component
struct Page_MigrationAbilityFirst {
private context = getContext(this) as common.UIAbilityContext;
build() {
// …
}
// …
onPageShow(){
// 进入该页面时,将应用设置为可迁移状态
this.context.setMissionContinueState(AbilityConstant.ContinueState.ACTIVE, (result) => {
hilog.info(DOMAIN_NUMBER, TAG, ‘%{public}s’, setMissionContinueState ACTIVE result: ${JSON.stringify(result)});
});
}
}

在某个组件的触发事件中设置应用迁移能力。

// Page_MigrationAbilityFirst.ets
import AbilityConstant from ‘@ohos.app.ability.AbilityConstant’;
import common from ‘@ohos.app.ability.common’;
import hilog from ‘@ohos.hilog’;
import promptAction from ‘@ohos.promptAction’;

const TAG: string = ‘[MigrationAbility]’;
const DOMAIN_NUMBER: number = 0xFF00;

@Entry
@Component
struct Page_MigrationAbilityFirst {
private context = getContext(this) as common.UIAbilityContext;
build() {
// …
Button() {
// …
}
.onClick(()=>{
// 点击该按钮时,将应用设置为可迁移状态
this.context.setMissionContinueState(AbilityConstant.ContinueState.ACTIVE, (result) => {
hilog.info(DOMAIN_NUMBER, TAG, ‘%{public}s’, setMissionContinueState ACTIVE result: ${JSON.stringify(result)});
});
})
}
}

保证迁移连续性

由于迁移加载时,对端拉起的应用可能执行过自己的迁移状态设置命令(例如,冷启动时对端在 onCreate() 中设置了 INACTIVE ;热启动时对端已打开了不可迁移的页面,迁移状态为 INACTIVE 等情况)。为了保证迁移过后的应用依然具有可以迁移回源端的能力,应在 onCreate() / onNewWant() 的迁移调用判断中,将迁移状态设置为 ACTIVE 。

// MigrationAbility.ets
import AbilityConstant from ‘@ohos.app.ability.AbilityConstant’;
import hilog from ‘@ohos.hilog’;
import UIAbility from ‘@ohos.app.ability.UIAbility’;
import type Want from ‘@ohos.app.ability.Want’;

const TAG: string = ‘[MigrationAbility]’;
const DOMAIN_NUMBER: number = 0xFF00;

export default class MigrationAbility extends UIAbility {
// …
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// …
// 调用原因为迁移时,设置状态为可迁移,应对冷启动情况
if (launchParam.launchReason == AbilityConstant.LaunchReason.CONTINUATION) {
this.context.setMissionContinueState(AbilityConstant.ContinueState.ACTIVE, (result) => {
hilog.info(setMissionContinueState ACTIVE result: ${JSON.stringify(result)});
});
}
}

onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// …
// 调用原因为迁移时,设置状态为可迁移,应对热启动情况
if (launchParam.launchReason == AbilityConstant.LaunchReason.CONTINUATION) {
this.context.setMissionContinueState(AbilityConstant.ContinueState.ACTIVE, (result) => {
hilog.info(DOMAIN_NUMBER, TAG, setMissionContinueState ACTIVE result: ${JSON.stringify(result)});
});
}
}
// …
}

按需迁移页面栈

支持应用动态选择是否进行页面栈恢复(默认进行页面栈信息恢复)。如果应用不想使用系统默认恢复的页面栈,则可以设置不进行页面栈迁移,而需要在onWindowStageRestore()设置迁移后进入的页面,参数定义见 SUPPORT_CONTINUE_PAGE_STACK_KEY 。

应用在源端的页面栈中存在Index和Second路由,而在对端恢复时不需要按照源端页面栈进行恢复,需要恢复到指定页面。

例如,UIAbility迁移不需要自动迁移页面栈信息。

// MigrationAbility.ets
import AbilityConstant from ‘@ohos.app.ability.AbilityConstant’;
import hilog from ‘@ohos.hilog’;
import UIAbility from ‘@ohos.app.ability.UIAbility’;
import wantConstant from ‘@ohos.app.ability.wantConstant’;
import type window from ‘@ohos.window’;

const TAG: string = ‘[MigrationAbility]’;
const DOMAIN_NUMBER: number = 0xFF00;

export default class MigrationAbility extends UIAbility {
// …
onContinue(wantParam: Record<string, Object>):AbilityConstant.OnContinueResult {
hilog.info(DOMAIN_NUMBER, TAG, onContinue version = ${wantParam.version}, targetDevice: ${wantParam.targetDevice});
wantParam[wantConstant.Params.SUPPORT_CONTINUE_PAGE_STACK_KEY] = false;
return AbilityConstant.OnContinueResult.AGREE;
}

onWindowStageRestore(windowStage: window.WindowStage) : void {
// 若不需要自动迁移页面栈信息,则需要在此处设置应用迁移后进入的页面
windowStage.loadContent(‘pages/page_migrationability/Page_MigrationAbilityThird’, (err, data) => {
if (err.code) {
hilog.error(DOMAIN_NUMBER, TAG, ‘Failed to load the content. Cause: %{public}s’, JSON.stringify(err) ?? ‘’);
return;
}
});
}
}

按需退出

支持应用动态选择迁移成功后是否退出迁移源端应用(默认迁移成功后退出迁移源端应用)。如果应用不想让系统自动退出迁移源端应用,则可以设置不退出,参数定义见 SUPPORT_CONTINUE_SOURCE_EXIT_KEY 。

示例:UIAbility设置迁移成功后,源端不需要退出迁移应用。

import AbilityConstant from ‘@ohos.app.ability.AbilityConstant’;
import hilog from ‘@ohos.hilog’;
import UIAbility from ‘@ohos.app.ability.UIAbility’;
import wantConstant from ‘@ohos.app.ability.wantConstant’;

const TAG: string = ‘[MigrationAbility]’;
const DOMAIN_NUMBER: number = 0xFF00;

export default class MigrationAbility extends UIAbility {
// …
onContinue(wantParam: Record<string, Object>):AbilityConstant.OnContinueResult {
hilog.info(DOMAIN_NUMBER, TAG, onContinue version = ${wantParam.version}, targetDevice: ${wantParam.targetDevice});
wantParam[wantConstant.Params.SUPPORT_CONTINUE_SOURCE_EXIT_KEY] = false;
return AbilityConstant.OnContinueResult.AGREE;
}
}

跨端迁移中的数据迁移

当前支持三种不同的数据迁移方式,开发者可以根据实际使用需要进行选择。

说明:
部分ArkUI组件支持通过配置restoreId的方式,在迁移后将特定状态恢复到对端设备。详情请见分布式迁移标识

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!


img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

效果低效又漫长,而且极易碰到天花板技术停滞不前!**


[外链图片转存中…(img-d82g18dv-1715275393761)]
[外链图片转存中…(img-JClMciIg-1715275393761)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值