当前位置: 首页 > article >正文

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

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

一、前言

本文是鸿蒙中的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
生命周期入口onCreateonNewWant(单实例)
页面栈处理重建页面栈恢复现有页面栈
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. 恢复数据

onCreateonNewWant中解析参数:

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); // 恢复页面路由}
}

注意

1. 数据限制:单次备份最大200KB,存储时效7天,重启设备不保留。
2. 适用场景:临时数据(如未保存的表单)、页面状态(如滚动位置),不建议存储敏感数据
3. 性能优化:避免在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;
}
4. 目标端(接收设备)恢复

冷启动时通过onCreate恢复,热启动时通过onNewWant恢复:

onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {if (launchParam.launchReason === CONTINUATION) {const editorData = want.parameters?.editorData;this.editor.setData(editorData); // 恢复数据this.context.restoreWindowStage(); // 自动恢复页面栈}
}

注意

1. 针对动态开关迁移:通过setMissionContinueState控制(如在非编辑页禁用):

// 在非编辑页关闭迁移
this.context.setMissionContinueState(AbilityConstant.ContinueState.INACTIVE);

2. 针对自定义页面栈:关闭自动恢复,手动指定目标页面:

onContinue(wantParam) {wantParam[wantConstant.Params.SUPPORT_CONTINUE_PAGE_STACK_KEY] = false; // 禁用自动恢复wantParam["targetPage"] = "SummaryPage"; // 自定义目标页面
}

3. 针对大数据迁移:使用分布式数据对象(DDO)同步文件或大文本:

// 源端创建DDO并保存
const ddo = distributedDataObject.create(this.context, largeData);
wantParam["ddoSessionId"] = ddo.genSessionId(); // 传递会话ID至目标端
http://www.lryc.cn/news/2395330.html

相关文章:

  • 基于内存高效算法的 LLM Token 优化:一个有效降低 API 成本的技术方案
  • vue-11(命名路由和命名视图)
  • (附代码)自定义 LangChain 文档分割器,深入探索 LangChain 文档分割策略与应用
  • Python打卡训练营Day42
  • 基于微信小程序的scratch学习系统
  • MATLAB实战:机器学习分类回归示例
  • 动态库导出符号与extern “C“
  • 小知识:STM32 printf 重定向(串口输出)--让数据 “开口说话” 的关键技巧
  • `docker commit` 和 `docker save`区别
  • 【C++ 多态】—— 礼器九鼎,釉下乾坤,多态中的 “风水寻龙诀“
  • SCSAI平台面向对象建模技术的设计与实现
  • pikachu通关教程-CSRF
  • 智能体觉醒:AI开始自己“动手”了-自主进化开启任务革命时代
  • Python爬虫实战:研究Aiohttp库相关技术
  • 【C++指南】C++ list容器完全解读(二):list模拟实现,底层架构揭秘
  • [神经网络]使用olivettiface数据集进行训练并优化,观察对比loss结果
  • 小明的Java面试奇遇之智能家装平台架构设计与JVM调优实战
  • n8n:技术团队的智能工作流自动化助手
  • Flink 核心机制与源码剖析系列
  • 华院计算出席信创论坛,分享AI教育创新实践并与燧原科技共同推出教育一体机
  • 华为OD机试真题——会议接待 /代表团坐车(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
  • LabVIEW Val (Sgnl) 属性
  • STM32G4 电机外设篇(三) TIM1 发波 和 ADC COMP DAC级联
  • DAY 35 超大力王爱学Python
  • 【数据结构】图的存储(十字链表)
  • 005 flutter基础,初始文件讲解(4)
  • Redis最佳实践——秒杀系统设计详解
  • STM32软件spi和硬件spi
  • MATLAB实战:人脸检测与识别实现方案
  • 深度刨析树结构(从入门到入土讲解AVL树及红黑树的奥秘)