【鸿蒙开发基础学习】UIAbility 组件生命周期

news2024/9/24 17:09:36

UIAbility 组件生命周期

概述

当用户打开、切换和返回到对应应用时,应用中的 UIAbility 实例会在其生命周期的不同状态之间转换。UIAbility 类提供了一系列回调,通过这些回调可以知道当前 UIAbility 实例的某个状态发生改变,会经过 UIAbility 实例的创建和销毁,或者 UIAbility 实例发生了前后台的状态切换。

UIAbility 的生命周期包括 Create、Foreground、Background、Destroy 四个状态,如下图所示。

UIAbility 生命周期状态

生命周期状态说明

Create 状态

Create 状态为在应用加载过程中,UIAbility 实例创建完成时触发,系统会调用 onCreate() 回调。可以在该回调中进行页面初始化操作,例如变量定义资源加载等,用于后续的 UI 展示。

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 页面初始化 
  } 
  //... 
} 

说明:Want 是对象间信息传递的载体,可以用于应用组件间的信息传递。Want 的详细介绍请参见信息传递载体 Want。

WindowStageCreate 和 WindowStageDestroy 状态

UIAbility 实例创建完成之后,在进入 Foreground 之前,系统会创建一个 WindowStage。WindowStage 创建完成后会进入 onWindowStageCreate() 回调,可以在该回调中设置 UI 加载、设置 WindowStage 的事件订阅。

WindowStageCreate 和 WindowStageDestroy 状态

onWindowStageCreate() 回调中通过 loadContent() 方法设置应用要加载的页面,并根据需要调用 on('windowStageEvent') 方法订阅 WindowStage 的事件(获焦/失焦、可见/不可见)。

import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI'; 
import { hilog } from '@kit.PerformanceAnalysisKit';

const TAG: string = '[EntryAbility]'; 
const DOMAIN_NUMBER: number = 0xFF00; 

export default class EntryAbility extends UIAbility {
  //... 
  onWindowStageCreate(windowStage: window.WindowStage): void {
    // 设置 WindowStage 的事件订阅(获焦/失焦、可见/不可见)
    try { 
      windowStage.on('windowStageEvent', (data) => {
        let stageEventType: window.WindowStageEventType = data;
        switch (stageEventType) { 
          case window.WindowStageEventType.SHOWN: // 切到前台
            hilog.info(DOMAIN_NUMBER, TAG, 'windowStage foreground.');
            break; 
          case window.WindowStageEventType.ACTIVE: // 获焦状态
            hilog.info(DOMAIN_NUMBER, TAG, 'windowStage active.');
            break; 
          case window.WindowStageEventType.INACTIVE: // 失焦状态
            hilog.info(DOMAIN_NUMBER, TAG, 'windowStage inactive.');
            break; 
          case window.WindowStageEventType.HIDDEN: // 切到后台
            hilog.info(DOMAIN_NUMBER, TAG, 'windowStage background.');
            break; 
          default: 
            break; 
        } 
      }); 
    } catch (exception) { 
      hilog.error(DOMAIN_NUMBER, TAG, 'Failed to enable the listener for window stage event changes. Cause:' + JSON.stringify(exception));
    } 
    hilog.info(DOMAIN_NUMBER, TAG, '%{public}s', 'Ability onWindowStageCreate');
    // 设置 UI 加载 
    windowStage.loadContent('pages/Index', (err, data) => {
      //... 
    }); 
  } 
} 

说明:WindowStage 的相关使用请参见窗口开发指导。

对应于 onWindowStageCreate() 回调。在 UIAbility 实例销毁之前,则会先进入 onWindowStageDestroy() 回调,可以在该回调中释放 UI 资源。

import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI'; 
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';

const TAG: string = '[EntryAbility]'; 
const DOMAIN_NUMBER: number = 0xFF00; 

export default class EntryAbility extends UIAbility {
  windowStage: window.WindowStage | undefined = undefined;

  //... 
  onWindowStageCreate(windowStage: window.WindowStage): void {
    this.windowStage = windowStage; 
    //... 
  } 

  onWindowStageDestroy() { 
    // 释放 UI 资源 
    // 例如在 onWindowStageDestroy() 中注销获焦/失焦等 WindowStage 事件
    try { 
      if (this.windowStage) { 
        this.windowStage.off('windowStageEvent');
      } 
    } catch (err) { 
      let code = (err as BusinessError).code;
      let message = (err as BusinessError).message;
      hilog.error(DOMAIN_NUMBER, TAG, `Failed to disable the listener for windowStageEvent. Code is ${code}, message is ${message}`);
    } 
  } 
} 

WindowStageWillDestroy 状态

对应 onWindowStageWillDestroy() 回调,在 WindowStage 销毁前执行,此时 WindowStage 可以使用。

import { UIAbility } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI'; 

export default class EntryAbility extends UIAbility {
  windowStage: window.WindowStage | undefined = undefined;
  //... 
  onWindowStageCreate(windowStage: window.WindowStage): void {
    this.windowStage = windowStage; 
    //... 
  } 
  onWindowStageWillDestroy(windowStage: window.WindowStage) {
    // 释放通过 windowStage 对象获取的资源 
  } 
  onWindowStageDestroy() { 
    // 释放 UI 资源 
  } 
} 

说明:WindowStage 的相关使用请参见窗口开发指导。

Foreground 和 Background 状态

Foreground 和 Background 状态分别在 UIAbility 实例切换至前台和切换至后台时触发,对应于 onForeground() 回调和 onBackground() 回调。

onForeground() 回调,在 UIAbility 的 UI 可见之前,如 UIAbility 切换至前台时触发。可以在 onForeground() 回调中申请系统需要的资源,或者重新申请在 onBackground() 中释放的资源。

onBackground() 回调,在 UIAbility 的 UI 完全不可见之后,如 UIAbility 切换至后台时候触发。可以在 onBackground() 回调中释放 UI 不可见时无用的资源,或者在此回调中执行较为耗时的操作,例如状态保存等。

例如应用在使用过程中需要使用用户定位时,假设应用已获得用户的定位权限授权。在 UI 显示之前,可以在 onForeground() 回调中开启定位功能,从而获取到当前的位置信息。当应用切换到后台状态,可以在 onBackground() 回调中停止定位功能,以节省系统的资源消耗。

import { UIAbility } from '@kit.AbilityKit';

export default class EntryAbility extends UIAbility {
  //... 

  onForeground(): void { 
    // 申请系统需要的资源,或者重新申请在 onBackground() 中释放的资源
  } 

  onBackground(): void { 
    // 释放 UI 不可见时无用的资源,或者在此回调中执行较为耗时的操作
    // 例如状态保存等 
  } 
} 

当应用的 UIAbility 实例已创建,且 UIAbility 配置为 singleton 启动模式时,再次调用 startAbility() 方法启动该 UIAbility 实例时,只会进入该 UIAbility 的 onNewWant() 回调,不会进入其 onCreate()onWindowStageCreate() 生命周期回调。应用可以在该回调中更新要加载的资源和数据等,用于后续的 UI 展示。

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';

export default class EntryAbility extends UIAbility {
  //... 

  onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam) {
    // 更新资源、数据 
  } 
} 

Destroy 状态

Destroy 状态在 UIAbility 实例销毁时触发。可以在 onDestroy() 回调中进行系统资源的释放、数据的保存等操作。

例如调用 terminateSelf() 方法停止当前 UIAbility 实例,从而完成 UIAbility 实例的销毁;或者用户使用最近任务列表关闭该 UIAbility 实例,完成 UIAbility 的销毁。

import { UIAbility } from '@kit.AbilityKit';

export default class EntryAbility extends UIAbility {
  //... 

  onDestroy() { 
    // 系统资源的释放、数据的保存等 
  } 
} 

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

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

相关文章

DeDeCMS

DeDeCMS 环境部署 同意协议 环境检测 参数配置 漏洞复现 姿势⼀:通过⽂件管理器上传WebShell #前台 http://192.168.4.139/dedecms/index.php?upcache1 #后台 http://192.168.4.139/dedecms/dede/ #信息 username:admin password:admin 上传文件 成功上传 …

如何在Chrome、Edge、360、Firefox等浏览器查看网站SSL证书信息?

在如今的网络环境中,保障网络安全、数据安全尤其重要,市面上大部分网站都部署了SSL证书以实现HTTPS加密保护数据传输安全以及验证网站身份,确保网站安全可信。那么如何查看网站的SSL证书信息?接下来,我们将详细介绍如何…

Java零基础之多线程篇:讲解死锁和资源管理

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…

Qt 跨平台支持任务栏进度条以及自绘消息通知显示

一.效果图 win效果图 mac效果图 二.测试demo地址: testwindowbar: 跨平台的任务栏进度条

语言模型-预训练模型(三)

预训练-BERT 传统方法与预训练方法的比较预训练方式 --BERT训练任务模型结构BERT结构-EmbeddingBERT结构-EncoderBERT结构-self-attention 传统方法与预训练方法的比较 思想解读: 预训练的概念就和我们人读书和工作一样;先是通过基础教育到大学毕业&…

Gradio之文字输入输出

Gradio 是一个简单直观的交互界面的SDK组件。 在python 环境中安装使用pip install gradio 然后运行以下代码,就能在浏览器中展示 # 输入name字符串,输出Hello {name}!字符串 def greet(name):return "Hello " name "!"demo gr.I…

Python统计单词列表

文章目录 需求分析demo 需求 给定一组字符串words和每行能显示的最大字符数max_length,计算需要多少行才能完整显示所有的单词。 分析 思路很简单,从给定的字符串中按空格分割单词列表,计算一行能显示的单词数,将其添加到list中…

全国产飞腾D2000/8 ITX主板+银河麒麟Kylin/UOS 操作系统,应用于工业一体机, 工业平板、加固IPAD

ITX-F601一体机主板产品规格书 产品概述 ITX-F601是一款高性能一体机主板,基于国产飞腾处理器D2000/8 核处理器设计研发,低海岸线IO 设计,可用于工业一体机、工业平板等,合理摆放CPU,MINI-PCIE,M.2 槽位&…

UKP3D9.3版本导出报表文件

UKP3D9.3(8.4)号安装包,支持输出节点属性的文本报表。这个功能的实用性很强,适用于批量修改数据。 命令:TXTREPORT

百元护眼台灯有什么推荐?松下、飞利浦、书客看哪个更胜一筹

当前,近视问题在人群中的蔓延趋势愈发显著,几乎成为一种普遍现象。据最新出炉的2024年度统计数据显示,我国儿童及青少年群体的近视率已飙升至触目惊心的52.7%,这一数字不仅凸显了近视问题的严峻态势,更在社会上激起了广…

Java常见面试题-06-web

文章目录 TCP 与 UDP 区别?什么是 HTTP 协议?TCP 的三次握手HTTP 中重定向和请求转发的区别?Get 和 Post 的区别?cookie 和 session 的区别?介绍一下Ajax以及其优势axios 是什么?怎样使用它?怎么…

ICMP(Ping)功能原理及其C++实现简介

ICMP(Ping)功能原理及其应用简介 一、 Ping功能简介 1、 原始套接字(Raw Socket) 原始套接字(‌Raw Socket)‌是一种特殊的网络编程接口,‌它允许直接接收和发送网络层的数据包,‌而不是通过传输层。‌这种套接字可以接收本机网…

推荐 3个实用且完全免费的在线工具,每天都会用到,无需登录打开即用

100font 100font是一个专业的免费商用字体下载网站,专注于收集、整理和分享各种免费无版权的商用字体。用户可以在这个平台上找到并下载简体中文、繁体中文、英文、日文、韩文等多种语言类型的字体。 该网站的特点包括清晰的分类和直观的下载流程,用户可…

金字塔原理帮助你理清思路,提升职场表达力

金字塔原理帮助你理清思路 1分钟理清思路,提升职场表达力 金字塔原理概述 原则 解释 模型 结论先行 中心思想和结论只有一个,放在最前面 SCQA模型 以上统下 任一层的思想必须是下一层次思想的概括 演绎推理 归纳推理 归类分组 每组中的思想必…

【Linux网络】其他协议和技术:DNS、ICMP、NAT

本篇博客补充了 TCP/IP 分层模型中,应用层的 DNS 协议、网络层的 ICMP 协议、网络层的 NAT 技术,旨在让读者更加深入理解网络协议栈的设计和网络编程。 目录 一、DNS 协议 1)技术背景 2)域名与域名解析 二、ICMP 协议 1&…

Webstorm的下载与安装

Webstorm的下载 1 在浏览器的地址栏输入https://www.jetbrains.com/webstorm/,进入主页面 2 点击右上角的Download按钮,进入下载页面,如图所示 Webstorm的安装 按步骤逐步安装即可

tomcat文件上传漏洞练习

1、靶场账号注册 vulfocus 注册后邮箱中点击激活 2、首页选择并开启靶场 复制映射的ip和端口 在浏览器输入ip和端口 改成put并把1.jsp中内容复制进去 3打开哥斯拉,连接上面的网址

TCP协议程序设计

文章目录 前言一、TCP协议程序是什么?二、使用步骤 1.服务器端与客户端2.实操展示总结 前言 TCP网络程序设计是指利用Socket类编写通信程序。利用TCP协议进行通讯的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序&…

Go语言编程大全,web微服务数据库十大专题精讲

本课程主要从数据结构、Go Module 依赖管理、IO编程、数据库编程、消息队列、加密技术与网络安全、爬虫与反爬虫、web开发、微服务通用技术、Kitex框架等方面讲解~ 链接:https://pan.quark.cn/s/d65337a0e60d

S32K144 CAN使用

S32K144是恩智浦半导体推出的一款高性能微控制器(MCU),主要针对汽车和高可靠性的工业应用。在汽车工业应用中使用CAN总线必不可少。 需要注意的是在ISO 11898(High Speed,速度在5kbps-1Mbps)中,隐形电平电压差在0附件…