鸿蒙HarmonyOS应用开发——跨端迁移_openharmony 跨端迁移包括哪些(4)

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


img
img

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

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

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

在对端设备的UIAbility中,需要实现 onCreate()/onNewWant()接口来恢复迁移数据。

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

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

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

onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
console.info(‘EntryAbility onCreate’)
if (launchParam.launchReason == AbilityConstant.LaunchReason.CONTINUATION) {
// 将上述的保存的数据取出恢复
let continueInput = ‘’;
if (want.parameters != undefined) {
continueInput = JSON.stringify(want.parameters.data);
console.info(continue input ${continueInput})
}
// 将数据显示当前页面
this.context.restoreWindowStage(this.storage);
}
}

onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
console.info(‘EntryAbility onNewWant’)
if (launchParam.launchReason == AbilityConstant.LaunchReason.CONTINUATION) {
// get user data from want params
let continueInput = ‘’;
if (want.parameters != undefined) {
continueInput = JSON.stringify(want.parameters.data);
console.info(continue input ${continueInput});
}
this.context.restoreWindowStage(this.storage);
}
}
}

可选配置迁移能力

动态配置迁移能力

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

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

设置迁移能力的时机

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

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

// EntryAbility.ets
import UIAbility from ‘@ohos.app.ability.UIAbility’;
import AbilityConstant from ‘@ohos.app.ability.AbilityConstant’;
import Want from ‘@ohos.app.ability.Want’;

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

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

// PageName.ets
import AbilityConstant from ‘@ohos.app.ability.AbilityConstant’;
import common from ‘@ohos.app.ability.common’;
@Entry
@Component
struct PageName {
private context = getContext(this) as common.UIAbilityContext;
build() {
// …
}
// …
onPageShow(){
// 进入该页面时,将应用设置为可迁移状态
this.context.setMissionContinueState(AbilityConstant.ContinueState.ACTIVE, (result) => {
console.info(setMissionContinueState ACTIVE result: ${JSON.stringify(result)});
});
}
}

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

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

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

保证迁移连续性

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

// EntryAbility.ets
import UIAbility from ‘@ohos.app.ability.UIAbility’;
import AbilityConstant from ‘@ohos.app.ability.AbilityConstant’;
import Want from ‘@ohos.app.ability.Want’;

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

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

按需迁移页面栈

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

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

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

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

export default class EntryAbility extends UIAbility {
// …

onContinue(wantParam: Record<string, Object>) {
console.info(onContinue version = ${wantParam.version}, targetDevice: ${wantParam.targetDevice});
wantParam[wantConstant.Params.SUPPORT_CONTINUE_PAGE_STACK_KEY] = false;
return AbilityConstant.OnContinueResult.AGREE;
}

onWindowStageRestore(windowStage: window.WindowStage) {
// 若不需要自动迁移页面栈信息,则需要在此处设置应用迁移后进入的页面
windowStage.loadContent(‘pages/Index’, (err, data) => {
if (err.code) {
return;
}
});
}
}

按需退出

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

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

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

export default class EntryAbility extends UIAbility {
// …

onContinue(wantParam: Record<string, Object>) {
console.info(onContinue version = ${wantParam.version}, targetDevice: ${wantParam.targetDevice});
wantParam[wantConstant.Params.SUPPORT_CONTINUE_SOURCE_EXIT_KEY] = false;
return AbilityConstant.OnContinueResult.AGREE;
}
}

验证指导

为方便开发者验证已开发的可迁移应用,当前OpenHarmony提供了一个全局任务中心demo作为迁移的入口。下面介绍通过安装全局任务中心来验证迁移的方式。

1. 编译安装全局任务中心
配置环境

public-SDK不支持开发者使用所有的系统API,例如:全局任务中心使用的**@ohos.distributedDeviceManager**不包括在public_SDK中。因此为了正确编译安装全局任务中心,开发者需要替换full-SDK,具体操作可参见 替换指南。

说明
本文中的截图仅为参考,具体的显示界面请以实际使用的DevEco Studio和SDK的版本为准。

编译工程文件

​ a.新建OpenHarmony 空的工程,找到对应的文件夹替换下载文件

​ b.自动签名,编译安装。

​ DevEco的自动签名模板默认签名权限为normal级。而本应用设计到ohos.permission.MANAGE_MISSIONS权限为system_core级别。自动生成的签名无法获得足够的权限,所以需要将权限升级为system_core级别,然后签名。

​ c.系统权限设置(以api10目录为例): 将Sdk目录下的openharmony\api版本(如:10)\toolchains\lib\UnsgnedReleasedProfileTemplate.json文件中的”apl”:“normal_core”改为”apl”:“system_core”。

  1. 点击file->Project Structure。

  1. 点击Signing Configs 点击OK。

  1. 连接开发板运行生成demo。
2. 设备组网
  1. 打开A,B两设备的计算器。
  2. 点击右上角箭头选择B设备。
  3. 在B设备选择信任设备,弹出PIN码。
  4. 在A设备输入PIN码。
  5. 已组网成功,验证方法:在A设备输入数字,B设备同步出现则证明组网成功。
3. 发起迁移
  1. 在B设备打开多设备协同权限的应用,A设备打开全局任务中心demo,A设备出现A设备名称(即:本机:OpenHarmony 3.2)和B设备名称(OpenHarmony 3.2)。

  1. 点击B设备名称,然后出现B设备的应用。

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

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

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

[外链图片转存中…(img-WWFNLQmC-1715443888602)]
[外链图片转存中…(img-E6EsilEC-1715443888603)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

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

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值