当前位置: 首页 > 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至目标端

相关文章:

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

【HarmonyOS 5】鸿蒙中的UIAbility详解&#xff08;三&#xff09; 一、前言 本文是鸿蒙中的UIAbility详解系列的最终章。主要针对UIAbility的冷启动和热启动&#xff0c;对于want数据的处理。UIAbility的备份恢复&#xff0c;UIAbility的接续等高级功能的概念和使用讲解。 …...

基于内存高效算法的 LLM Token 优化:一个有效降低 API 成本的技术方案

在使用 OpenAI、Claude、Gemini 等大语言模型 API 构建对话系统时&#xff0c;开发者普遍面临成本不断上升的挑战。无论是基于检索增强生成&#xff08;RAG&#xff09;的应用还是独立的对话系统&#xff0c;这些系统都需要维护对话历史以确保上下文的连贯性&#xff0c;类似于…...

vue-11(命名路由和命名视图)

命名路由和命名视图 命名路由和命名视图提供了组织和导航 Vue.js 应用程序的强大方法&#xff0c;尤其是在它们的复杂性增加时。它们提供了一种语义更合理、可维护的路由方法&#xff0c;使您的代码更易于理解和修改。命名路由允许您按名称引用路由&#xff0c;而不是依赖 URL…...

(附代码)自定义 LangChain 文档分割器,深入探索 LangChain 文档分割策略与应用

自定义文档分割器 在 LangChain 中&#xff0c;如果内置的文档分割器均没办法完成需求&#xff0c;还可以根据特定的需求实现自定义文档分割器&#xff08;一般极少&#xff09;&#xff0c;实现的方法也非常简单&#xff0c;继承文本分割器基类 TextSplitter&#xff0c;在构造…...

Python打卡训练营Day42

DAY 42 Grad-CAM与Hook函数 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 作业&#xff1a;理解下今天的代码即可 import torch import torch.nn as nn import torch.nn.functional as F import torchvision import torchvision.transforms as tr…...

基于微信小程序的scratch学习系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…...

MATLAB实战:机器学习分类回归示例

以下是一个使用MATLAB的Statistics and Machine Learning Toolbox实现分类和回归任务的完整示例代码。代码包含鸢尾花分类、手写数字分类和汽车数据回归任务&#xff0c;并评估模型性能。 %% 加载内置数据集 % 鸢尾花数据集&#xff08;分类&#xff09; load fisheriris; X_i…...

动态库导出符号与extern “C“

1. windows下动态库导出符号 根据C/C语法规则&#xff0c;函数声明中的修饰符&#xff08;如__declspec(dllexport)&#xff09;可以放在返回类型之前或返回类型之后、函数名之前。这两种方式在功能上是等价的&#xff0c;编译器会以相同的方式处理。 __declspec(dllexport) …...

小知识:STM32 printf 重定向(串口输出)--让数据 “开口说话” 的关键技巧

引言 在 C 语言开发中&#xff0c;printf函数是我们调试程序、输出数据的得力助手&#xff0c;它能将格式化的数据输出到标准输出设备&#xff08;通常是屏幕&#xff09;。然而&#xff0c;在嵌入式领域&#xff0c;STM32 单片机并没有默认的显示设备&#xff0c;要让printf函…...

`docker commit` 和 `docker save`区别

理解 docker commit 和 docker save 之间的区别对于正确管理 Docker 镜像非常重要。让我们详细解释一下这两个命令的作用及其区别。 1. docker commit 作用&#xff1a; docker commit roop-builder roop:v1 命令的作用是基于一个正在运行的容器 roop-builder 创建一个新的镜…...

【C++ 多态】—— 礼器九鼎,釉下乾坤,多态中的 “风水寻龙诀“

欢迎来到一整颗红豆的博客✨&#xff0c;一个关于探索技术的角落&#xff0c;记录学习的点滴&#x1f4d6;&#xff0c;分享实用的技巧&#x1f6e0;️&#xff0c;偶尔还有一些奇思妙想&#x1f4a1; 本文由一整颗红豆原创✍️&#xff0c;感谢支持❤️&#xff01;请尊重原创…...

SCSAI平台面向对象建模技术的设计与实现

一、核心设计思想 SCSAI平台的核心目标是通过元建模&#xff08;Meta-Modeling&#xff09;技术实现面向对象建模的零编码化。其核心思想为&#xff1a; 自反性设计&#xff1a;定义ObjectClassInfo (OCI)为元类&#xff08;Meta-Class&#xff09;&#xff0c;所有对象类均为…...

pikachu通关教程-CSRF

CSRF(get) 用bp进行抓包 选择action value值的修改 点击test in browser copy然后放在bp代理的浏览器上&#xff0c;会出现一个提交按钮&#xff0c;这时候点击之后信息就被修改了。 CSRF(post) 请求的方式不同&#xff0c;其他都是一样 CSRF Token 存在cookie 首先要先下载一…...

智能体觉醒:AI开始自己“动手”了-自主进化开启任务革命时代

1. 智能体&#xff1a;AI从“工具”到“伙伴”的关键跃迁 1.1 什么是智能体&#xff1f; 智能体&#xff08;Agent&#xff09;是AI的“进化版”——它不再局限于生成文字或图像&#xff0c;而是能像人类一样“规划任务”“调用工具”甚至“协同合作”。例如&#xff0c;一个…...

Python爬虫实战:研究Aiohttp库相关技术

1. 引言 1.1 研究背景与意义 随着互联网的快速发展,网络上的数据量呈爆炸式增长。爬虫作为一种自动获取网络信息的工具,在数据挖掘、信息检索、舆情分析等领域有着广泛的应用。传统的同步爬虫在面对大量 URL 时效率低下,无法充分利用现代计算机的多核资源和网络带宽。而异…...

【C++指南】C++ list容器完全解读(二):list模拟实现,底层架构揭秘

. &#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注 文章目录 引言一、链表节点设计&#xff1a;双向链表的基石1.1 节点类的实现 二、list框架与核心成员函…...

[神经网络]使用olivettiface数据集进行训练并优化,观察对比loss结果

结合归一化和正则化来优化网络模型结构&#xff0c;观察对比loss结果 搭建的神经网络&#xff0c;使用olivettiface数据集进行训练&#xff0c;结合归一化和正则化来优化网络模型结构&#xff0c;观察对比loss结果 from sklearn.datasets import fetch_olivetti_faces #倒入数…...

小明的Java面试奇遇之智能家装平台架构设计与JVM调优实战

一、文章标题 小明的Java面试奇遇之智能家装平台架构设计与JVM调优实战 二、文章标签 Java面试, 智能家装, 微服务架构, 高并发设计, JVM调优, SpringCloud, 消息队列, 分布式缓存, 架构设计, 面试技巧 三、文章概述 本文模拟了程序员小明应聘智能家装平台后端架构师的5轮…...

n8n:技术团队的智能工作流自动化助手

在当前数字化时代,自动化已经成为提高效率和减轻人工工作负担的一大推动力。今天,我们要为大家介绍一款极具潜力的开源项目——n8n,它不仅拥有广泛的应用场景,还具备内置AI功能,能够完全满足技术团队的高效工作需求。n8n的出现,为技术团队提供了自由编程与快速自动化构建…...

Flink 核心机制与源码剖析系列

Flink 核心机制与源码剖析系列 目录 第一篇&#xff1a;Flink 状态管理原理与源码深度剖析第二篇&#xff1a;水位线、事件时间与定时器源码全流程第三篇&#xff1a;Flink CEP 模式建模与高效事件匹配机制 第一篇&#xff1a;Flink 状态管理原理与源码深度剖析 1. 背景与意…...

华院计算出席信创论坛,分享AI教育创新实践并与燧原科技共同推出教育一体机

5月21日&#xff0c;信创论坛于上海漕河泾会议中心举办。本次论坛以“聚力融合&#xff0c;繁荣生态”为主题&#xff0c;话题聚焦工业制造、交通运输、金融、教育、医疗等领域。华院计算技术&#xff08;上海&#xff09;股份有限公司&#xff08;以下简称“华院计算”&#x…...

华为OD机试真题——会议接待 /代表团坐车(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《会议…...

LabVIEW Val (Sgnl) 属性

在 LabVIEW 事件驱动架构中&#xff0c;Val (Sgnl) 属性&#xff08;Value (Signaling)&#xff09;是实现编程触发与用户交互行为一致性的关键技术。与普通 Value 属性不同&#xff0c;Val (Sgnl) 在修改控件值的同时强制生成值改变事件&#xff0c;确保程序逻辑与 UI 交互保持…...

STM32G4 电机外设篇(三) TIM1 发波 和 ADC COMP DAC级联

目录 一、STM32G4 电机外设篇&#xff08;三&#xff09; TIM1 发波 和 ADC COMP DAC级联1 TIM1 高级定时器发波1.1 stm32cubemx配置 2 TIM1 ADC COMP DAC级联2.1 stm32cubemx配置 附学习参考网址欢迎大家有问题评论交流 (* ^ ω ^) 一、STM32G4 电机外设篇&#xff08;三&…...

DAY 35 超大力王爱学Python

知识点回顾&#xff1a; 三种不同的模型可视化方法&#xff1a;推荐torchinfo打印summary权重分布可视化进度条功能&#xff1a;手动和自动写法&#xff0c;让打印结果更加美观推理的写法&#xff1a;评估模式 作业&#xff1a;调整模型定义时的超参数&#xff0c;对比下效果。…...

【数据结构】图的存储(十字链表)

弧节点 tailvex数据域&#xff1a;存储弧尾一端顶点在顺序表中的位置下标&#xff1b;headvex 数据域&#xff1a;存储弧头一端顶点在顺序表中的位置下标&#xff1b;hlink 指针域&#xff1a;指向下一个以当前顶点作为弧头的弧&#xff1b;tlink 指针域&#xff1a;指向下一个…...

005 flutter基础,初始文件讲解(4)

书接上回&#xff0c;今天继续完成最后的讲解&#xff1a; class _MyHomePageState extends State<MyHomePage> {int _counter 0;void _incrementCounter() {setState(() {_counter;});}可以看到&#xff0c;这里的_MyHomePageState是一个类&#xff0c;继承于 State&l…...

Redis最佳实践——秒杀系统设计详解

基于Redis的高并发秒杀系统设计&#xff08;十万级QPS&#xff09; 一、秒杀系统核心挑战 瞬时流量洪峰&#xff1a;100万 QPS请求冲击库存超卖风险&#xff1a;精准扣减防止超卖系统高可用性&#xff1a;99.99%服务可用性要求数据强一致性&#xff1a;库存/订单/支付状态同步…...

STM32软件spi和硬件spi

核心观点 本文主要介绍了SPI通信的两种实现方式&#xff1a;软件SPI和硬件SPI。详细阐述了SPI通信协议的基本概念、硬件电路连接方式、移位示意图、时序基本单元以及四种工作模式。同时&#xff0c;对W25Q64模块进行了详细介绍&#xff0c;包括其硬件电路、框图以及操作注意事…...

MATLAB实战:人脸检测与识别实现方案

我们要用电脑识别照片或视频中的人脸&#xff0c;并知道是谁的脸。就像手机相册能自动识别照片里的人是谁一样。 &#x1f50d; 人脸检测&#xff08;找脸&#xff09; 目标&#xff1a;在图片中找到人脸的位置 怎么做&#xff1a; 用MATLAB的"人脸扫描仪"&#xff…...