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

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

一、UIAbility是什么?

Stage模型中的组件类型名,即UIAbility组件,包含UI,提供展示UI的能力,主要用于和用户交互。

UIAbility类似于传统移动开发Android中的Activity或者Fragment。类似IOS开发中的 UIViewController。

UIAbility 是 HarmonyOS 应用框架的核心组件,负责管理应用的用户界面生命周期和上下文信息。

二、设置指定启动页面

启动页面必须设置:否则应用启动后会白屏。

避免应用启动后白屏,需在onWindowStageCreate生命周期中设置默认加载页面。通过WindowStageloadContent()方法指定页面路径。

export default class EntryAbility extends UIAbility {onWindowStageCreate(windowStage: window.WindowStage): void {windowStage.loadContent('pages/Index', (err, data) => { /* 处理回调 */ });}
}

DevEco Studio默认生成的项目会自动加载Index页面,可按需修改路径。

三、获取上下文信息(UIAbilityContext)

获取应用配置信息(如包名、Ability名称等),或调用操作Ability的方法(如启动、终止Ability)。通过this.context直接访问。

export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {const context = this.context; // 直接获取上下文}
}

在页面组件中获取
通过getUIContext().getHostContext()转换为UIAbilityContext

@Entry
@Component
struct Page {private context = this.getUIContext().getHostContext() as common.UIAbilityContext;startAbilityTest() { this.context.startAbility(want); } // 启动其他Ability
}
启动页面设置与上下文使用代码示例
// UIAbility定义
export default class EntryAbility extends UIAbility {onWindowStageCreate(windowStage: window.WindowStage) {windowStage.loadContent('pages/Main', () => {}); // 设置启动页面}onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {const context = this.context; // 获取上下文context.startAbility({ abilityName: 'OtherAbility' }); // 启动其他Ability}
}// 页面组件中使用上下文
@Entry
@Component
struct MainPage {private context = this.getUIContext().getHostContext() as common.UIAbilityContext;build() {Button('终止当前Ability').onClick(() => this.context.terminateSelf());}
}

四、UIAbility生命周期与操作

UIAbility的生命周期包含 Create(创建)、Foreground(前台)、Background(后台)、Destroy(销毁) 四个核心状态,以及与窗口(WindowStage)相关的子状态。通过生命周期回调钩子函数,可监听状态变化并执行对应操作。

生命周期状态流转图

创建实例          窗口创建       进入前台         切到后台         窗口销毁       实例销毁↓               ↓             ↓               ↓               ↓             ↓
onCreate() → onWindowStageCreate() → onForeground() → onBackground() → onWindowStageDestroy() → onDestroy()↑       ↖                ↗                ↖                ↑└─────── WindowStageWillDestroy() ────────────────────────┘
1、onCreate

UIAbility实例创建完成时触发。初始化页面数据、加载资源(如定义变量、获取上下文this.context)。

export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {// 初始化操作(如获取上下文、配置数据)const context = this.context; }
}
2、WindowStageCreate

UIAbility实例创建后,进入前台前,系统创建WindowStage时触发。设置启动页面(loadContent())、订阅窗口事件(如前后台切换、焦点变化)。

onWindowStageCreate(windowStage: window.WindowStage) {windowStage.loadContent('pages/Index'); // 设置启动页面windowStage.on('windowStageEvent', (event) => { // 订阅窗口事件switch (event) {case window.WindowStageEventType.SHOWN: // 切到前台console.log('窗口切到前台');break;}});}
3、WindowStageWillDestroy

WindowStage销毁前触发(此时窗口仍可用)。释放通过WindowStage获取的资源,注销事件订阅(off('windowStageEvent'))。

4、WindowStageDestroy

WindowStage销毁时触发(UI资源释放)。释放UI相关资源(如临时文件、图形对象)。

5、Foreground

UIAbility切换至前台、UI可见前触发。申请系统资源(如定位、传感器权限)、恢复后台释放的资源。

    onForeground() {// 开启定位功能location.start(); }
6、Background

UIAbility切换至后台、UI完全不可见后触发。释放无用资源、执行耗时操作(如数据持久化)。

    onBackground() {// 停止定位、保存当前状态location.stop(); saveDataToLocal();}
7、onDestroy

UIAbility实例被终止时触发(如调用terminateSelf())。释放全局资源、清理内存(如关闭网络连接、注销监听器)。

onDestroy() {// 释放数据库连接、取消定时器db.close(); clearInterval(timer);
}

注意:API 13+中,若用户通过最近任务一键清理应用,不会触发onDestroy(),而是直接终止进程。

四、UIAbility的常用函数操作

1. 终止UIAbility实例

调用terminateSelf()终止当前Ability。

context.terminateSelf((err) => {if (err) { console.error('终止失败:', err); } else { console.info('终止成功'); }
});
2. 获取拉起方信息

当UIAbilityA通过startAbility启动UIAbilityB时,UIAbilityB可获取调用方信息。

export default class UIAbilityB extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {console.log(`调用方Pid: ${want.parameters?.['ohos.aafwk.param.callerPid']}`);}
}
跨Ability信息传递代码示例
// UIAbilityA中启动UIAbilityB
@Entry
@Component
struct UIAbilityAPage {private context = this.getUIContext().getHostContext() as common.UIAbilityContext;build() {Button('拉起UIAbilityB').onClick(() => {this.context.startAbility({ bundleName: this.context.abilityInfo.bundleName, abilityName: 'UIAbilityB' });});}
}// UIAbilityB中获取调用方信息
export default class UIAbilityB extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {console.log(`调用方包名: ${want.parameters?.['ohos.aafwk.param.callerBundleName']}`);}
}

注意

当UIAbility设置为singleton启动模式时,重复调用startAbility()启动同一实例,不会重新走onCreateonWindowStageCreate流程,而是触发onNewWant回调。

onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam) {// 根据新的Want参数更新页面数据this.data = want.parameters?.data; 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/82376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Transformer预训练模型微调技术全解析

引言:Transformer预训练模型与微调的浪潮 近年来,人工智能领域取得了令人瞩目的成就,特别是在自然语言处理(NLP)方面。引领这场变革的核心技术之一便是Transformer架构。自2017年 Vaswani 等人在论文 "Attention Is All You Need" 中提出以来,Transformer凭借…

《算法笔记》12.2小节——字符串专题->KMP算法 问题 C: 剪花布条

题目描述 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? 输入 输入中含有一些数据,分别是成对出现的…

实现一个前端动态模块组件(Vite+原生JS)

1. 引言 在前面的文章《使用Vite创建一个动态网页的前端项目》中我们实现了一个动态网页。不过这个动态网页的实用价值并不高,在真正实际的项目中我们希望的是能实现一个动态的模块组件。具体来说,就是有一个页面控件同时在多个页面中使用,那…

NTFS0x90属性和0xa0属性和0xb0属性的一一对应关系是index_entry中的index_node中VCN和runlist和bitmap

第一部分: 0: kd> dt _FILE_RECORD_SEGMENT_HEADER 0xc1241400 Ntfs!_FILE_RECORD_SEGMENT_HEADER 0x000 MultiSectorHeader : _MULTI_SECTOR_HEADER 0x008 Lsn : _LARGE_INTEGER 0x80e74aa 0x010 SequenceNumber : 5 0x012 Referen…

PCB 通孔是电容性的,但不一定是电容器

哼?……这是什么意思?…… 多年来,流行的观点是 PCB 通孔本质上是电容性的,因此可以用集总电容器进行建模。虽然当信号的上升时间大于或等于过孔不连续性延迟的 3 倍时,这可能是正确的,但我将向您展示为什…

Flutter 3.32 新特性

2天前,Flutter发布了最新版本3.32,我们来一起看下29到32有哪些变化。 简介 欢迎来到Flutter 3.32!此版本包含了旨在加速开发和增强应用程序的功能。准备好在网络上进行热加载,令人惊叹的原生保真Cupertino,以及与Fir…

汉诺塔超级计算机数据区结构和源代码详细设计

### 数据区结构与源代码详细设计 基于"满秩二叉树"存储模型的设计理念,我设计了以下数据区结构和实现方案: #### 1. 满秩二叉树存储模型 **数据结构设计**: python class TreeNode: """二叉树节点结构&#xff0c…

GitHub Copilot 现已支持 AI Coding Agent

VS Code 开始越来越像 Cursor 和 WindSurf 了。 这周,GitHub 发布了一个新的编程代理,直接嵌入到 GitHub 中。当你将 GitHub 问题分配给 Copilot 或在 VS Code 中提示它时,该代理会启动一个由 GitHub Actions 驱动的安全且完全可定制的开发环境。 这一公告来自微软首席执行…

【辰辉创聚生物】FGF信号通路相关蛋白:解码生命调控的关键枢纽

在生命科学的探索旅程中,成纤维细胞生长因子(Fibroblast Growth Factor,FGF)信号通路犹如精密仪器中的核心齿轮,驱动着众多生命活动的有序进行。FGF 信号通路相关蛋白作为该通路的重要组成部分,其结构与功能…

算法的学习笔记— 构建乘积数组(牛客JZ66)

构建乘积数组 1. 问题背景与描述 1.1 题目来源与链接 本题来源于NowCoder在线编程平台,是剑指Offer系列面试题中的经典问题。题目链接为:NowCoder。该问题在算法面试中出现频率较高,主要考察数组操作和数学思维。 1.2 问题描述与要求 给…

SpringBoot+ELK 搭建日志监控平台

ELK 简介 ELK(Elasticsearch, Logstash, Kibana)是一个目前主流的开源日志监控平台。由三个主要组件组成的: Elasticsearch: 是一个开源的分布式搜索和分析引擎,可以用于全文检索、结构化检索和分析,它构建…

python36

仔细回顾一下神经网络到目前的内容,没跟上进度的同学补一下进度。 作业:对之前的信贷项目,利用神经网络训练下,尝试用到目前的知识点让代码更加规范和美观。 # 先运行之前预处理好的代码 import pandas as pd import pandas as pd…

SGlang 推理模型优化(PD架构分离)

一、技术背景 随着大型语言模型(LLM)广泛应用于搜索、内容生成、AI助手等领域,对模型推理服务的并发能力、响应延迟和资源利用效率提出了前所未有的高要求。与模型训练相比,推理是一个持续进行、资源消耗巨大的任务,尤…

模型实战(28)之 yolov5分类模型 训练自己的数据集

模型实战(28)之 yolov5分类模型 训练自己的数据集 本文以手写数字数据集为例总结YOLO分类模型如何训练自己的数据集,关于数据集的预处理可以看这篇:https://blog.csdn.net/yohnyang/article/details/148209978?spm=1001.2014.3001.5502 yolov5曾是在 2021-2023 年十分流行…

医学写作人才管理策略

1. 人才选择:精准定位核心能力 1.1 人才筛选标准 1.1.1 硬性要求 初创生物制药公司医学写作岗位对专业背景要求严格,候选人需具备医学、药学或生物学硕士及以上学历,博士优先。同时,熟悉ICH、FDA/EMA等法规指南是必备条件,且至少有1-3年医学写作经验,或相关领域如临床研…

Axure酒店管理系统原型

酒店管理系统通常被设计为包含多个模块或界面,以支持酒店运营的不同方面和参与者。其中,管理端和商户端是两个核心组成部分,它们各自承担着不同的职责和功能。 软件版本:Axure RP 9 预览地址:https://556i1e.axshare.…

云原生安全之HTTP协议:从基础到实战的安全指南

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念:HTTP协议的核心要素 HTTP(HyperText Transfer Protocol)是云原生应用中客户端与服务器通信的基础协议&a…

怎样解决photoshop闪退问题

检查系统资源:在启动 Photoshop 之前,打开任务管理器检查 CPU 和内存的使用情况。如果发现资源占用过高,尝试关闭不必要的程序或重启计算机以释放资源。更新 Photoshop 版本:确保 Photoshop 是最新版本。Adobe 经常发布更新以修复…

修复ubuntu server笔记本合盖导致的无线网卡故障

下班回到家发现走时还好的局域网 ubuntu server 24 连不上了,赶紧打开笔记本查看下原因,发现控制台出了一堆看不懂的内容: 根据搜索结果,笔记本合盖导致无线网卡故障可能与电源管理设置和系统休眠策略有关,以下是具体…

CMake指令:find_package()在Qt中的应用

目录 1.简介 2.Qt 核心组件与常用模块 3.配置模式的工作流程 4.完整示例:构建 Qt GUI 应用 5.常见问题与解决方案 6.总结 1.简介 在 CMake 中使用 find_package(Qt) 是集成 Qt 库的核心步骤。Qt 从 5.x 版本开始全面支持 配置模式(Config Mode&…