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

【HarmonyOS5】UIAbility组件生命周期详解:从创建到销毁的全景解析

在这里插入图片描述

⭐本期内容:【HarmonyOS5】UIAbility组件生命周期详解:从创建到销毁的全景解析
🏆系列专栏:鸿蒙HarmonyOS:探索未来智能生态新纪元


文章目录

  • 前言
  • 生命周期全景图
  • 详细状态解析与最佳实践
    • 🎬 Create状态
    • 🖼️ WindowStage状态
    • 🌅 Foreground/Background状态
  • 总结


前言

UIAbility组件作为鸿蒙系统中关键部分,承担着应用与用户交互的责任。本文将深入探讨UIAbility的生命周期,从创建、窗口状态到前后台切换,全面解析各个阶段的最佳实践。


生命周期全景图

通过以下的时序图,我们可以清晰地看到UIAbility组件在整个生命周期中的各种状态和相互关系。用户的操作与系统的响应交织在一起,构成了UIAbility的完整生命周期。

用户 系统 UIAbility实例 WindowStage 页面 启动应用 onCreate() Create状态 初始化资源 创建WindowStage onWindowStageCreate() loadContent() 加载页面 onForeground() Foreground状态 切换到后台 onBackground() Background状态 返回应用 onForeground() 关闭应用 onWindowStageWillDestroy() onWindowStageDestroy() onDestroy() Destroy状态 用户 系统 UIAbility实例 WindowStage 页面

详细状态解析与最佳实践

🎬 Create状态

Create状态是UIAbility生命的起点,在这个阶段,开发者需要完成基础设施的搭建。

💡 实践要点:

  • 快速响应原则:避免在onCreate中执行耗时操作
  • 异常处理机制:为每个初始化步骤提供fallback方案
  • 资源优先级:优先加载用户立即需要的资源
  • 状态管理:建立完善的状态恢复机制
export default class SmartOfficeAbility extends UIAbility {// 全局配置管理器private configManager: ConfigManager = new ConfigManager();// 网络服务管理器private networkManager: NetworkManager = new NetworkManager();// 用户状态管理器private userStateManager: UserStateManager = new UserStateManager();onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {hilog.info(0x0000, 'SmartOffice', '应用启动中...');// 1. 初始化核心配置this.initializeConfiguration();// 2. 建立网络连接this.establishNetworkConnection();// 3. 恢复用户状态this.restoreUserState();// 4. 预加载关键资源this.preloadCriticalResources();hilog.info(0x0000, 'SmartOffice', '应用初始化完成');}private async initializeConfiguration(): Promise<void> {try {await this.configManager.loadConfiguration();hilog.info(0x0000, 'SmartOffice', '配置加载完成');} catch (error) {hilog.error(0x0000, 'SmartOffice', `配置加载失败: ${error}`);// 使用默认配置this.configManager.useDefaultConfiguration();}}private async establishNetworkConnection(): Promise<void> {try {await this.networkManager.initialize();hilog.info(0x0000, 'SmartOffice', '网络连接建立');} catch (error) {hilog.error(0x0000, 'SmartOffice', `网络初始化失败: ${error}`);// 启用离线模式this.networkManager.enableOfflineMode();}}private async restoreUserState(): Promise<void> {const savedUserState = await this.userStateManager.restoreState();if (savedUserState) {hilog.info(0x0000, 'SmartOffice', '用户状态已恢复');} else {hilog.info(0x0000, 'SmartOffice', '新用户,准备引导流程');}}private preloadCriticalResources(): void {// 预加载字体、图标等关键资源hilog.info(0x0000, 'SmartOffice', '关键资源预加载完成');}
}

🖼️ WindowStage状态

在WindowStage状态,UIAbility与用户界面的交互开始真正建立。此时,需要完成窗口的初始化工作,包括窗口的配置、事件的注册等。

关键点:

  • 窗口属性配置:确保窗口的外观与用户体验相匹配,例如设置状态栏和导航栏的颜色,调整窗口大小等。
  • 事件监听:注册窗口事件,以便能够根据用户的操作变化动态调整应用的状态。
  • 页面内容加载:根据用户的登录状态和其他条件,决定加载不同的启动页面,确保用户能够快速进入所需的功能。
export default class SmartOfficeAbility extends UIAbility {private windowStageEventHandler: WindowStageEventHandler = new WindowStageEventHandler();onWindowStageCreate(windowStage: window.WindowStage): void {hilog.info(0x0000, 'SmartOffice', ' WindowStage创建中...');// 1. 配置窗口属性this.configureWindowProperties(windowStage);// 2. 注册窗口事件监听this.registerWindowStageEvents(windowStage);// 3. 动态加载启动页面this.loadStartupPage(windowStage);// 4. 设置窗口动画this.setupWindowAnimations(windowStage);}private async configureWindowProperties(windowStage: window.WindowStage): Promise<void> {try {const mainWindow = await windowStage.getMainWindow();// 设置窗口属性await mainWindow.setWindowSystemBarProperties({statusBarContentColor: '#FF000000',navigationBarContentColor: '#FF000000',statusBarColor: '#FFFFFF',navigationBarColor: '#FFFFFF'});// 设置窗口大小和位置await mainWindow.setWindowLayoutFullScreen(true);hilog.info(0x0000, 'SmartOffice', '窗口属性配置完成');} catch (error) {hilog.error(0x0000, 'SmartOffice', `窗口配置失败: ${error}`);}}private registerWindowStageEvents(windowStage: window.WindowStage): void {windowStage.on('windowStageEvent', (data) => {const eventType: window.WindowStageEventType = data;this.windowStageEventHandler.handleEvent(eventType);switch (eventType) {case window.WindowStageEventType.SHOWN:this.onWindowShown();break;case window.WindowStageEventType.ACTIVE:this.onWindowActive();break;case window.WindowStageEventType.INACTIVE:this.onWindowInactive();break;case window.WindowStageEventType.HIDDEN:this.onWindowHidden();break;}});}private async loadStartupPage(windowStage: window.WindowStage): Promise<void> {try {// 根据用户状态和启动参数决定启动页面const startupPage = await this.determineStartupPage();await windowStage.loadContent(startupPage, (err, data) => {if (err.code) {hilog.error(0x0000, 'SmartOffice', `页面加载失败: ${JSON.stringify(err)}`);// 加载默认页面windowStage.loadContent('pages/ErrorPage');return;}hilog.info(0x0000, 'SmartOffice', `页面加载成功: ${startupPage}`);// 触发页面加载完成事件this.onPageLoadComplete(startupPage);});} catch (error) {hilog.error(0x0000, 'SmartOffice', `启动页面确定失败: ${error}`);}}private async determineStartupPage(): Promise<string> {// 检查用户登录状态const isLoggedIn = await this.userStateManager.isUserLoggedIn();if (!isLoggedIn) {return 'pages/LoginPage';}// 检查是否有待办任务const hasPendingTasks = await this.checkPendingTasks();if (hasPendingTasks) {return 'pages/TasksDashboard';}// 默认工作台页面return 'pages/WorkspacePage';}private async checkPendingTasks(): Promise<boolean> {// 检查待办任务的逻辑return false;}private onPageLoadComplete(pageName: string): void {hilog.info(0x0000, 'SmartOffice', `页面 ${pageName} 加载完成`);// 可以在这里进行页面加载后的初始化工作}
}

🌅 Foreground/Background状态

在移动应用中,前后台切换是常态,智能的资源管理能够显著提升用户体验。在Foreground状态下,应用需要恢复必要的服务、刷新数据以及重新建立与服务器的连接。而在Background状态下,应用则应保存用户数据、暂停非关键服务并释放内存资源

关键点:

  • 关键服务的恢复与暂停:确保必要的服务在应用切换到前台时被激活,而在后台时合理暂停,避免浪费资源。
  • 数据的刷新与保存:在前台时应及时更新数据,以保持用户界面的实时性,而在后台时应保存用户的操作状态和临时数据,以便下次恢复。
  • 内存资源的释放:在应用进入后台时,及时释放不再需要的内存资源,降低系统负担,提升整体性能。
Background状态
切换到前台
Foreground状态
恢复服务
刷新数据
重新连接
切换到后台
Background状态
暂停服务
保存数据
释放资源
定位服务
网络轮询
音频播放
用户数据
应用状态
临时文件
内存缓存
网络连接
媒体资源

示例代码如下:

export default class SmartOfficeAbility extends UIAbility {private serviceManager: ServiceManager = new ServiceManager();private dataManager: DataManager = new DataManager();private resourceManager: ResourceManager = new ResourceManager();onForeground(): void {hilog.info(0x0000, 'SmartOffice', '应用进入前台');// 1. 恢复关键服务this.resumeCriticalServices();// 2. 刷新数据this.refreshApplicationData();// 3. 重新建立连接this.reestablishConnections();// 4. 更新UI状态this.updateUIState();// 5. 发送应用激活事件this.notifyApplicationActivated();}onBackground(): void {hilog.info(0x0000, 'SmartOffice', '应用进入后台');// 1. 保存关键数据this.saveApplicationState();// 2. 暂停非必要服务this.pauseNonEssentialServices();// 3. 释放内存资源this.releaseMemoryResources();// 4. 设置后台刷新策略this.setupBackgroundRefreshStrategy();// 5. 发送应用进入后台事件this.notifyApplicationBackgrounded();}private async resumeCriticalServices(): Promise<void> {try {// 恢复网络服务await this.serviceManager.resumeNetworkService();// 恢复定位服务(如果需要)await this.serviceManager.resumeLocationService();// 恢复推送服务await this.serviceManager.resumePushService();hilog.info(0x0000, 'SmartOffice', '关键服务已恢复');} catch (error) {hilog.error(0x0000, 'SmartOffice', `服务恢复失败: ${error}`);}}private async refreshApplicationData(): Promise<void> {try {// 检查数据更新const hasUpdates = await this.dataManager.checkForUpdates();if (hasUpdates) {// 增量更新数据await this.dataManager.performIncrementalUpdate();hilog.info(0x0000, 'SmartOffice', '数据更新完成');} else {hilog.info(0x0000, 'SmartOffice', '数据已是最新');}} catch (error) {hilog.error(0x0000, 'SmartOffice', `数据刷新失败: ${error}`);}}private async saveApplicationState(): Promise<void> {try {// 保存用户操作状态await this.dataManager.saveUserState();// 保存应用配置await this.dataManager.saveApplicationConfig();// 保存临时数据await this.dataManager.saveTempData();hilog.info(0x0000, 'SmartOffice', '应用状态已保存');} catch (error) {hilog.error(0x0000, 'SmartOffice', `状态保存失败: ${error}`);}}private pauseNonEssentialServices(): void {// 暂停动画this.serviceManager.pauseAnimations();// 暂停定时器this.serviceManager.pauseTimers();// 暂停非关键网络请求this.serviceManager.pauseNonCriticalNetworkRequests();hilog.info(0x0000, 'SmartOffice', '非必要服务已暂停');}private releaseMemoryResources(): void {// 清理图片缓存this.resourceManager.clearImageCache();// 释放大对象this.resourceManager.releaseLargeObjects();// 清理临时文件this.resourceManager.cleanupTempFiles();hilog.info(0x0000, 'SmartOffice', '内存资源已释放');}
}

总结

深入理解UIAbility组件生命周期,能够帮助开发者高效管理应用状态和资源,从而优化用户体验。从创建初始化到窗口状态切换,再到前后台转换,每个阶段的合理设计与实现都将显著影响应用性能和稳定性。

如有任何疑问,欢迎随时与我交流。
请添加图片描述

相关文章:

【HarmonyOS5】UIAbility组件生命周期详解:从创建到销毁的全景解析

⭐本期内容&#xff1a;【HarmonyOS5】UIAbility组件生命周期详解&#xff1a;从创建到销毁的全景解析 &#x1f3c6;系列专栏&#xff1a;鸿蒙HarmonyOS&#xff1a;探索未来智能生态新纪元 文章目录 前言生命周期全景图详细状态解析与最佳实践&#x1f3ac; Create状态&#…...

在命令行直接执行可以执行成功,加入crontab定时任务执行shell脚本不成功失败的问题解决方法

今天遇到在命令行直接执行可以执行成功&#xff0c;加入crontab定时任务执行shell脚本却不成功失败的问题&#xff0c;踩坑了很长时间 记录下我的解决方法 原来我的定时任务填写方式: [roottao ~]# crontab -l */10 * * * * /bin/sh /search/index.sh >>/dev/null 2&g…...

c++ 静态成员变量

Student.h头文件内容&#xff1a; #pragma once #include <string> using namespace std;class Student { public:string name;int score;static int totalScore; // 静态局部变量声明Student(string name, int score);~Student();void print() const; };Student.cpp源文…...

分布式爬虫代理IP使用技巧

最近我们讨论的是分布式爬虫如何使用代理IP。在我们日常的分布式爬虫系统中&#xff0c;多个爬虫节点同时工作&#xff0c;每个节点都需要使用代理IP来避免被目标网站封禁。怎么解决代理IP问题显得尤为重要。 我们知道在分布式爬虫中使用代理IP是解决IP封禁、提高并发能力和实…...

数据分析之OLTP vs OLAP

数据处理系统主要有两种基本方法&#xff1a;一种注重数据操作(增删查改)&#xff0c;另一种注重商业智能数据分析。 这两种系统是&#xff1a; 联机事务处理&#xff08;OLTP&#xff09; 联机分析处理&#xff08;OLAP&#xff09; Power BI专为与OLAP系统兼容而构建&…...

Flask音频处理:构建高效的Web音频应用指南

引言 在当今多媒体丰富的互联网环境中&#xff0c;音频处理功能已成为许多Web应用的重要组成部分。无论是音乐分享平台、语音识别服务还是播客应用&#xff0c;都需要强大的音频处理能力。Python的Flask框架因其轻量级和灵活性&#xff0c;成为构建这类应用的理想选择。 本文…...

powershell 安装 .netframework3.5

在 PowerShell 中安装 .NET Framework 3.5 可以通过几种不同的方法实现&#xff0c;取决于你的操作系统版本。以下是几种常见的方法&#xff1a; 方法1&#xff1a;使用 DISM 命令 对于 Windows 10 和 Windows 8.1&#xff0c;你可以使用 DISM&#xff08;Deployment Image Se…...

dvwa5——File Upload

LOW 在dvwa里建一个testd2.php文件&#xff0c;写入一句话木马&#xff0c;密码password antsword连接 直接上传testd2.php文件&#xff0c;上传成功 MEDIUM 查看源码&#xff0c;发现这一关只能提交jpg和png格式的文件 把testd2.php的后缀改成jpg&#xff0c;上传时用bp抓包…...

cv::FileStorage用法

cv::FileStorage 是 OpenCV 中的一个类&#xff0c;用于读取和写入结构化数据&#xff08;如 YAML、XML、JSON&#xff09;。它非常适合保存和加载诸如&#xff1a; 相机内参&#xff08;K、D&#xff09; 位姿&#xff08;R、T&#xff09; IMU 数据 配置参数 向量、矩阵、…...

Go 语言 := 运算符详解(短变量声明)

Go 语言 : 运算符详解&#xff08;短变量声明&#xff09; : 是 Go 语言中特有的​​短变量声明运算符​​&#xff08;short variable declaration&#xff09;&#xff0c;它提供了简洁的声明并初始化变量的方式。这是 Go 语言中常用且强大的特性之一。 基本语法和用途 va…...

【优选算法】C++滑动窗口

1、长度最小的子数组 思路&#xff1a; class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {// 滑动窗口// 1.left0,right0// 2.进窗口( nums[right])// 3.判断// 出窗口// (4.更新结果)// 总和大于等于 target 的长度最小的 子数组…...

关于GitHub action云编译openwrt

特别声明:此教程仅你有成功离线编译的经验后,使用下列教程更佳 不建议没有任何成功经验的人进行云编译 1、准备工作 使用GitHub云编译模板 GitHub - jxjxcw/build_openwrt: 利用Actions在线云编译openwrt固件,适合官方源码,lede,lienol和immortalwrt源码,支持X86,电…...

数据库学习(二)——MySQL语句

MySQL 语句分为&#xff1a; 语句类型作用关键字示例数据查询&#xff08;DQL&#xff09;查询数据SELECT数据操作&#xff08;DML&#xff09;插入、更新、删除数据INSERT, UPDATE, DELETE数据定义&#xff08;DDL&#xff09;定义或修改表结构CREATE, ALTER, DROP事务控制&a…...

AI Agent 架构设计:ReAct 与 Self-Ask 模式对比与分析

一、引言 (一) AI Agent 技术发展背景 &#x1f680; AI Agent 的演进是一场从“遵循指令”到“自主决策”的深刻变革。早期&#xff0c;以规则引擎为核心的系统&#xff08;如关键词匹配的客服机器人&#xff09;只能在预设的流程上运行。然而&#xff0c;大语言模型的崛起为…...

sql入门语句-案例

Sql入门 数据库、数据表、数据的关系介绍 数据库 用于存储和管理数据的仓库 一个库中可以包含多个数据表 数据表 数据库最重要的组成部分之一 它由纵向的列和横向的行组成(类似excel表格) 可以指定列名、数据类型、约束等 一个表中可以存储多条数据 数据 想要永久化存储…...

A Survey on the Memory Mechanism of Large Language Model based Agents

目录 摘要Abstract1. LLM-Based Agent的Memory1.1 基础概念1.2 用于解释Memory的例子1.3 智能体记忆的定义1.3.1 狭义定义(肯定不用这个定义)1.3.2 广义定义 1.4 记忆协助下智能体与环境的交互过程1.4.1 记忆写入1.4.2 记忆管理1.4.3 记忆读取1.4.4 总过程 2. 如何实现智能体记…...

华为OD机试 - 猴子吃桃 - 二分查找(Java 2025 B卷 200分)

public class Test14 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {String[] s = sc.nextLine().split(" ");int[] arr = new int[s.length-1];int count = Integer.parseInt(s[s...

提取数据区域中表格

查看本示例演示效果本示例关键代码的编写位置&#xff0c;请参考“开始 - 快速上手”里您所使用的开发语言框架的最简集成代码 在实际的开发过程中&#xff0c;有时会遇到希望提取Word文档中表格数据保存到服务器的需求&#xff0c;此时可以使用PageOffice提取Word文档数据区域…...

【设计模式-5】设计模式的总结

说明&#xff1a;介绍完所有的设计模式&#xff0c;本文做一下总结 设计模式介绍 博主写的设计模式博客如下&#xff1a; 【设计模式-1】UML和设计原则 【设计模式-2.1】创建型——单例模式 【设计模式-2.2】创建型——简单工厂和工厂模式 【设计模式-2.3】创建型——原型…...

【无人机】无人机UAV、穿越机FPV的概念介绍,机型与工具,证书与规定

【无人机】无人机UAV、穿越机FPV的概念介绍&#xff0c;机型与工具&#xff0c;证书与规定 文章目录 1、无人机的定义、概念、技术栈1.1 无人机的概念1.2 无人机技术&#xff08;飞控&#xff0c;动力&#xff0c;通信&#xff09; 2、无人机机型2.1 DJI无人机 &#xff08;航拍…...

链表好题-多种实现

143. 重排链表 - 力扣&#xff08;LeetCode&#xff09; 这道题非常经典&#xff0c;很多大厂都作为面试题。 方法一&#xff1a;寻找中点翻转链表合并链表 class Solution { public:void reorderList(ListNode* head) {if (head nullptr) {return;}ListNode* mid middleNo…...

oracle数据恢复—oracle数据库执行truncate命令后的怎么恢复数据?

oracle数据库误执行truncate命令导致数据丢失是一种常见情况。通常情况下&#xff0c;oracle数据库误操作删除数据只需要通过备份恢复数据即可。也会碰到一些特殊情况&#xff0c;例如数据库备份无法使用或者还原报错等。下面和大家分享一例oracle数据库误执行truncate命令导致…...

OneNet + openssl + MTLL

1.OneNet 使用的教程 1.在网络上搜索onenet&#xff0c;注册并且登录账号。 2.产品服务-----物联网服务平台立即体验 3.在底下找到立即体验进去 4.产品开发------创建产品 5.关键是选择MQTT&#xff0c;其他的内容自己填写 6.这里产品以及开发完成&#xff0c;接下来就是添加设…...

分享两个日常办公软件:uTools、PixPin

1. uTools 网址&#xff1a;https://u.tools/ 这是一个高效智能的在线工具平台。 特点&#xff1a; 专为提升用户的工作效率跟生活便利性设计。 优点&#xff1a; 1&#xff1a;由国内团队开发。 2&#xff1a;通过插件化的方式为用户提供多样化的功能支持。 3&#xf…...

Golang基础学习

​​​​​​​​​​ 初见golang语法 go项目路径 cd $GOPATH //ls可以看到有bin,pkg,src三个文件 cd src/ mkdir GolangStudy cd GolangStudy mkdir firstGolanggo程序执行: go run hello.go//如果想分两步执行: go build hello.go ./hello导入包的方式 import "f…...

[学习] GNSS信号跟踪环路原理、设计与仿真(仿真代码)

GNSS信号跟踪环路原理、设计与仿真 文章目录 GNSS信号跟踪环路原理、设计与仿真一、GNSS信号跟踪环路概述二、跟踪环路基本原理1. 信号跟踪的概念与目标2. 锁相环&#xff08;PLL&#xff09;原理3. 锁频环&#xff08;FLL&#xff09;原理4. 延迟锁定环&#xff08;DLL&#x…...

Python实例题:Python计算微积分

目录 Python实例题 题目 代码实现 实现原理 符号计算&#xff1a; 数值计算&#xff1a; 可视化功能&#xff1a; 关键代码解析 1. 导数计算 2. 积分计算 3. 微分方程求解 4. 函数图像绘制 使用说明 安装依赖&#xff1a; 基本用法&#xff1a; 示例输出&#…...

如何判断指针是否需要释放?

在 C 中判断一个指针是否需要释放可以考虑以下几个方面&#xff1a; 一、确定指针的来源 1. 动态分配的内存&#xff1a; 如果指针是通过new、new[]、malloc、calloc等动态内存分配函数获取的&#xff0c;那么在不再需要该内存时&#xff0c;必须手动释放。 例如&#xff1a…...

Spark 之 AQE

个人其他链接 AQE 执行顺序https://blog.csdn.net/zhixingheyi_tian/article/details/125112793 AQE 产生 AQE 的 循环触发点 src/main/scala/org/apache/spark/sql/execution/adaptive/AdaptiveSparkPlanExec.scala override def doExecute(): RDD[InternalRow] = {withFin…...

随访系统安装的记录

安装PG17.5 安装https://www.cnblogs.com/nulixuexipython/p/18040243 1、遇到navicat链接不了PG https://blog.csdn.net/sarsscofy/article/details/84985933 2、查看有无安装mysqlhttps://blog.51cto.com/u_16175430/7261412 3、 方案一&#xff1a;oracle不开日志 data…...