2024年鸿蒙最全HarmonyOS 应用开发之跨端迁移保姆级教程~,HarmonyOS鸿蒙 handler面试

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


img
img

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

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

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

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的方式,在迁移后将特定状态恢复到对端设备。详情请见分布式迁移标识

如果涉及分布式对象和分布式文件迁移时应注意:

  1. 需要申请ohos.permission.DISTRIBUTED_DATASYNC权限,配置方式请参见 声明权限 。
  2. 同时需要在应用首次启动时弹窗向用户申请授权,使用方式请参见 向用户申请授权 。
使用wantParam迁移数据

在需要迁移的数据较少(100KB以下)时,开发者可以选择在wantParam中增加字段进行数据迁移。示例如下:

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

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

export default class MigrationAbility extends UIAbility {
// 源端保存
onContinue(wantParam: Record<string, Object>):AbilityConstant.OnContinueResult {
// 将要迁移的数据保存在wantParam的自定义字段(例如data)中
const continueInput = ‘迁移的数据’;
wantParam[‘data’] = continueInput;
return AbilityConstant.OnContinueResult.AGREE;
}

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

使用分布式对象迁移数据

当需要迁移的数据较大(100KB以上)时,可以选择 分布式对象 进行数据迁移。

  1. 在源端onContinue()接口中创建一个分布式数据对象 DataObject ,将所要迁移的数据填充到分布式对象数据中,并将生成的sessionId通过want传递到对端。
  2. 对端在onCreate()/onNewWant中进行数据恢复时,可以从want中读取该sessionId,通过分布式对象恢复数据。
使用分布式文件迁移数据

当需要迁移的数据较大(100KB以上)时,也可以选择分布式文件进行数据迁移。相比于分布式对象,分布式文件更适用于需要传输的数据为文件的场景。在源端将数据写入分布式文件路径后,对端迁移后拉起的应用能够在同个分布式文件路径下访问到该文件。

验证指导

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

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

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

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

下载MissionCenter_Demo 示例代码
编译工程文件

a.新建一个工程,找到对应的文件夹替换下载文件

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

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

c.系统权限设置(以api10目录为例): 将Sdk目录下的openharmony\api版本(如:10)\toolchains\lib\UnsignedReleasedProfileTemplate.json文件中的"apl":“normal"改为"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设备的应用。

  1. 最后将应用拖拽到A设备名称处,A设备应用被拉起,B设备应用退出。

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05
  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05
  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05
  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

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


img
img

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

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

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

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


[外链图片转存中…(img-x5eYusHk-1715492958241)]
[外链图片转存中…(img-PW2ryJ9Y-1715492958242)]

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值