【HarmonyOS 5】鸿蒙中的UIAbility详解(三)

GeorgeGcs
• 阅读 2

##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙游戏类应用 (游戏# 一、前言 本文是鸿蒙中的UIAbility详解系列的最终章。主要针对UIAbility的冷启动和热启动,对于want数据的处理。UIAbility的备份恢复,UIAbility的接续等高级功能的概念和使用讲解。

二、UIAbility启动模式:冷启动与热启动的Want数据处理

  1. 冷启动(Cold Start) 应用首次启动或被系统完全终止后重新创建。
    冷启动,应用会从onCreate函数中进入,通过want参数,我们可以处理其中携带的信息。像applink就是uri,deeplink就是parameters?.deepLink,还有推送等。 核心逻辑很简单,根据want中对应需要处理的字段信息,进行逻辑处理(跳转目标页面,数据和业务处理等)。 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { const deepLinkData = want.parameters?.deepLink; // 解析深层链接参数 this.initData(deepLinkData); }
  2. 热启动(Warm Start) 应用在后台运行时被重新激活(如切换任务或接收新事件)。
    一般和冷启动处理是一对儿,处理逻辑也和冷启动一致。只不过此时应用从onNewWant函数跳进来。时机也是App已经创建了,此时又被激活。 onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam) { if (launchParam.launchReason === AbilityConstant.LaunchReason.NEW_WANT) { const updateData = want.parameters?.updateData; // 解析热启动参数 this.refreshUI(updateData); } }

总结:冷热启动区别对比 特性 冷启动 热启动 触发条件 首次启动/进程终止后重启 从后台唤醒/接收新Want 生命周期入口 onCreate onNewWant(单实例) 页面栈处理 重建页面栈 恢复现有页面栈 Want参数来源 启动时指定(如图标点击、链接) 运行中动态传入(如跨Ability调用) 3. 源码示例 // EntryAbility.ets export default class EntryAbility extends UIAbility { private selectPage: string = '';

// 冷启动时触发 onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { this.parseParams(want); // 解析参数 }

// 热启动时触发 onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam) { this.parseParams(want); // 解析参数 if (this.currentWindowStage) { this.onWindowStageCreate(this.currentWindowStage); // 重新加载页面 } }

// 解析参数逻辑 private parseParams(want: Want) { if (want.parameters?.params) { const params = JSON.parse(want.parameters.params as string); this.selectPage = params.targetPage; // 获取目标页面标识(funA/funB) } }

// 加载页面 onWindowStageCreate(windowStage: window.WindowStage) { let targetPage = 'pages/Index'; // 默认页面 switch (this.selectPage) { case 'funA': targetPage = 'pages/FunA'; break; case 'funB': targetPage = 'pages/FunB'; break; } windowStage.loadContent(targetPage); // 加载对应页面 } }

二、UIAbility备份恢复:保障异常终止后的状态延续 应用因系统资源不足被后台终止时,自动保存状态。 下次启动时还原数据(如编辑中的内容、页面位置)。

  1. 启用备份功能 在onCreate中调用setRestoreEnabled(true):
    export default class EntryAbility extends UIAbility { onCreate() { this.context.setRestoreEnabled(true); // 初始化时启用备份 } }
  2. 保存自定义数据 重写onSaveState方法,通过WantParams存储数据:
    onSaveState(state: AbilityConstant.StateType, wantParams: Record<string, Object>) { wantParams["editorContent"] = this.editor.getText(); // 保存编辑内容 wantParams["currentPage"] = this.router.getCurrentPage(); // 保存页面路由 return AbilityConstant.OnSaveResult.ALL_AGREE; }
  3. 恢复数据 在onCreate或onNewWant中解析参数:
    onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { if (want.parameters?.editorContent) { this.editor.setText(want.parameters.editorContent as string); // 恢复文本 this.router.navigateTo(want.parameters.currentPage as string); // 恢复页面路由 } } 注意
  4. 数据限制:单次备份最大200KB,存储时效7天,重启设备不保留。
  5. 适用场景:临时数据(如未保存的表单)、页面状态(如滚动位置),不建议存储敏感数据。
  6. 性能优化:避免在onSaveState中执行耗时操作,优先存储关键状态。

三、应用接续(Continuation):跨设备任务无缝迁移 将当前页面状态、路由信息迁移至另一设备(如手机→平板)。 支持按场景开启/关闭迁移(如仅在编辑页允许迁移)。 小数据通过wantParam传输(≤100KB),大数据使用分布式数据对象(DDO)。

  1. 配置可迁移能力 在module.json5中设置continuable: true:
    { "abilities": [ { "name": "EditorAbility", "continuable": true // 启用跨设备迁移 } ] }

  2. 源端(发起迁移设备)实现 onContinue回调:保存数据、校验兼容性、决定是否迁移。
    onContinue(wantParam: Record<string, Object>): OnContinueResult { // 校验目标设备版本 if (wantParam.version < MIN_SUPPORT_VERSION) return MISMATCH;

    // 保存编辑内容 wantParam["editorData"] = this.editor.getData();

    // 动态控制迁移状态(如仅在编辑页允许迁移) if (this.currentPage !== 'EditorPage') return REJECT;

    return AGREE; }

  3. 目标端(接收设备)恢复 冷启动时通过onCreate恢复,热启动时通过onNewWant恢复:
    onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) { if (launchParam.launchReason === CONTINUATION) { const editorData = want.parameters?.editorData; this.editor.setData(editorData); // 恢复数据 this.context.restoreWindowStage(); // 自动恢复页面栈 } } 注意

  4. 针对动态开关迁移:通过setMissionContinueState控制(如在非编辑页禁用):
    // 在非编辑页关闭迁移 this.context.setMissionContinueState(AbilityConstant.ContinueState.INACTIVE);

  5. 针对自定义页面栈:关闭自动恢复,手动指定目标页面:
    onContinue(wantParam) { wantParam[wantConstant.Params.SUPPORT_CONTINUE_PAGE_STACK_KEY] = false; // 禁用自动恢复 wantParam["targetPage"] = "SummaryPage"; // 自定义目标页面 }

    1. 针对大数据迁移:使用分布式数据对象(DDO)同步文件或大文本:
      // 源端创建DDO并保存 const ddo = distributedDataObject.create(this.context, largeData); wantParam["ddoSessionId"] = ddo.genSessionId(); // 传递会话ID至目标端
点赞
收藏
评论区
推荐文章
GeorgeGcs GeorgeGcs
13小时前
【 HarmonyOS 5 入门系列 】鸿蒙HarmonyOS示例项目讲解
【HarmonyOS5入门系列】鸿蒙HarmonyOS示例项目讲解\鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言:移动开发声明式UI框架的技术变革在移动操作系统的发展历程中,UI开发模式经历了从命令式到声明式的重大变革。根据
GeorgeGcs GeorgeGcs
13小时前
【HarmonyOS 5】AttributeModifier和AttributeUpdater区别详解
【HarmonyOS5】AttributeModifier和AttributeUpdater区别详解\鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、AttributeModifier和AttributeUpdater的定义和作用1
GeorgeGcs GeorgeGcs
6小时前
从“备胎”到领航者,鸿蒙操作系统的传奇进化
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财【HarmonyOS5】2019年,在全球科技产业的风云变幻中,华为正式推出了鸿蒙操作系统(HarmonyOS),这一消息如同一颗重磅炸弹,瞬间吸引了全世界的目光。彼时,外界对鸿蒙的诞生背
GeorgeGcs GeorgeGcs
4小时前
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言在HarmonyOS5的应用开发模型中,featureAbility是旧版FA模型(FeatureAbility)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文
GeorgeGcs GeorgeGcs
4小时前
【HarmonyOS 5】鸿蒙中的UIAbility详解(一)
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、UIAbility是什么?Stage模型中的组件类型名,即UIAbility组件,包含UI,提供展示UI的能力,主要用于和用户交互。UIAbility类似于传统移动开发Android中
GeorgeGcs GeorgeGcs
4小时前
【HarmonyOS 5】鸿蒙中的UIAbility详解(二)
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言今天我们继续深入讲解UIAbility,根据下图可知,在鸿蒙中UIAbility继承于Ability,开发者无法直接继承Ability。只能使用其两个子类:UIAbility和Ex
GeorgeGcs GeorgeGcs
4小时前
【HarmonyOS 5】Laya游戏如何鸿蒙构建发布详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙游戏类应用(游戏一、前言LayaAir引擎是国内最强大的全平台引擎之一,当年H5小游戏火的时候,腾讯入股了腊鸭。我还在游戏公司的时候,17年曾经开发使用腊鸭的H5小游戏,很怀念当年和腊鸭同事一起解决问题的时光
GeorgeGcs GeorgeGcs
4小时前
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言在HarmonyOS5的应用开发模型中,featureAbility是旧版FA模型(FeatureAbility)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文
GeorgeGcs GeorgeGcs
2小时前
【HarmonyOS 5】鸿蒙用户头像编辑功能实践
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言1、应用背景在鸿蒙化开发过程中,我们发现最基本常见的功能用户头像的编辑,实现方式和Android与IOS有极大的不同。在实际开发和调研的过程中,我们发现并总结了鸿蒙隐私处理与业内A
GeorgeGcs GeorgeGcs
2小时前
【HarmonyOS 5】鸿蒙Web组件和内嵌网页双向通信DEMO示例
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言在ArkUI开发中,Web组件(Web)允许开发者在应用内嵌入网页,实现混合开发场景。本文将通过完整DEMO,详解如何通过WebviewController实现ArkUI与内嵌网页
GeorgeGcs
GeorgeGcs
Lv1
男 · 金融头部企业 · 鸿蒙应用架构师
HarmonyOS认证创作先锋,华为HDE专家,鸿蒙讲师,作者。目前任职鸿蒙应用架构师。 历经腾讯,宝马,研究所,金融。 待过私企,外企,央企。 深耕大应用开发领域十年。 AAE,Harmony(OpenHarmony\HarmonyOS),MAE(Android\IOS),FE(H5\Vue\RN)。
文章
56
粉丝
1
获赞
2