【HarmonyOS-Stage应用模型-UIAbility生命周期】

概述

在应用开发过程中,组件的生命周期尤为重要,当用户打开、切换和返回到对应应用时,应用中的UIAbility实例会在其生命周期的不同状态之间转换。我们可以通过生命周期来对应用的状态进行监控并执行特定的操作。比如在创建时进行应用初始化、销毁时进行数据清除等。本文主要简单介绍了Stage模型中UIAbility的生命周期,希望能帮助到大家。详细请跳转至官网了解【UIAbility生命周期】

Stage模型基本概念

在介绍UIAbility生命周期之前,首先先了解一下Stage应用模型的一些基本概念。先看下图,描述了Stage模型的概念图。

在这里插入图片描述
上图可以看出,当我们的应用经过编译打包之后生成的HAP包,在安装之后运行时会先创建一个AbilityStage实例(可以将AbilityStage实例理解为整个Stage应用实例)。然后Stage模型提供了两种组件UIAbility组件、ExtensionAbility组件,这两种组件都有具体的类承载,支持面向对象的开发方式。然后UIAbility组件会和WindowStage绑定(WindowStage是应用进程内的窗口管理器),UIAbility会通过WindowStage创建一个窗口(Window)用于页面ArkUI Page的渲染。而ArkUI Page中就是我们写的page页面。其中生成AbilityStage实例的时候也会生成全局基本的Context上下文,然后UIAbility组件和各种ExtensionAbility派生类都有各自不同的Context类(UIAbilityContext),他们都继承自基类Context,但是各自又根据所属组件,提供不同的能力。

名称解释

可能看到上面,有点头昏,不清楚什么是HAP、Conetext、WindowStage…这些名词,所以在这里简单介绍一下这个名词的定义。

  • Module
    Module是HarmonyOS应用的基本功能单元,一个Module包含源代码、资源文件、第三方依赖、服务配置等文件,每一个Module都可以单独进行编译打包运行。一个应用可以有多个Module,而一个Module包含Ability(UIAbility)和Library两类。
    可以理解为一个Module就是一个独立的小应用,而一个大应用可以有多个小应用(Module)集成。一个Module(小应用)包含多个UIAbility。
    应用程序App、Module、Ability、Library的关系如下:
    在这里插入图片描述

  • HAR和HSP
    Ability类型的Module经过编译打包后生成的.hap文件就是HAP(Harmony Ability Package应用程序包),Library类型的Module打包之后就是HAR(Harmony Archive)或者叫HSP(Harmony Shared Package 共享包)。由命名就能看出Library类型的包可以支持其他HAP应用程序当作第三方引入。

  • AbilityStage
    每个Entry类型或者Feature类型的HAP在运行期都有一个AbilityStage类实例,当HAP中的代码首次被加载到进程中的时候,系统会先创建AbilityStage实例。

  • UIAbility组件和ExtensionAbility组件
    Stage模型提供UIAbility和ExtensionAbility两种类型的组件,这两种组件都有具体的类承载,支持面向对象的开发方式。

    • UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互。例如,图库类应用可以在UIAbility组件中展示图片瀑布流,在用户选择某个图片后,在新的页面中展示图片的详细内容。同时用户可以通过返回键返回到瀑布流页面。UIAbility的生命周期只包含创建/销毁/前台/后台等状态,与显示相关的状态通过WindowStage的事件暴露给开发者。每一个UIAbility组件实例,都对应于一个最近任务列表中的任务。

    • ExtensionAbility组件是一种面向特定场景的应用组件。开发者并不直接从ExtensionAbility派生,而是需要使用ExtensionAbility的派生类。目前ExtensionAbility有用于卡片场景的FormExtensionAbility,用于闲时任务场景的WorkSchedulerExtensionAbility等多种派生类,这些派生类都是基于特定场景提供的。例如,用户在桌面创建应用的卡片,需要应用开发者从FormExtensionAbility派生,实现其中的回调函数,并在配置文件中配置该能力。ExtensionAbility派生类实例由用户触发创建,并由系统管理生命周期。在Stage模型上,普通应用开发者不能开发自定义服务,而需要根据自身的业务场景通过ExtensionAbility的派生类来实现。

  • WindowStage
    每个UIAbility类实例都会与一个WindowStage类实例绑定,WindowStage类起到了应用进程内窗口管理器的作用,它包含一个主窗口。也就是说,UIAbility通过WindowStage持有了一个窗口,该窗口为ArkUI提供了绘制区域。

  • Context
    在Stage模型上,Context及其派生类向开发者提供在运行期可以调用的各种能力。UIAbility组件和各种ExtensionAbility派生类都有各自不同的Context类,他们都继承自基类Context,但是各自又根据所属组件,提供不同的能力。

Stage基本概念总结

可能上面太多定义性的东西,不太好理解,所以这里说一下我的理解,如果有问题欢迎评论指正。
在基于Stage模型进行应用开发后,经过编译打包生成.hap文件,在用户终端上安装之后,点击运行时会先创建一个Stage实例和基本上下文Context。然后该Stage实例上提供两个组件UIAbility组件和ExtensionAbility组件。然后UIAbility通过WindowStage(窗口管理器)来创建了一个window窗口来进行ArkUI Page的显示。在这个过程中不同的UIAbility组件和ExtensionAbility派生类都会基于基本Context来封装各自不同的Context类(UIAbilityContext),并提供各种独特的功能。

UIAbility生命周期

进入正题,在实际用户使用应用的过程中无非就是打开、切换、返回、关闭应用,所以UIAbility的生命周期只有4个。分别为创建Create、前台Foreground、后台Background、销毁Destory。

生命周期图如下:
在这里插入图片描述

PS: 生命周期都是在EntryAbility.ts文件中写的

Create

应用加载过程中,UIAbility创建实例之前会触发onCreate回调,在该回调我们可以进行数据的初始化操作,比如全局变量定义、资源加载请求等

import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';export default class EntryAbility extends UIAbility {onCreate(want, launchParam) {// 页面初始化}// ...
}

Foreground

在UIAbility实例切换至前台,UIAbility界面还没有显示之前会触发onForeground回调,比如开启应用/由后台切回的时候,在该回调中我们可以用于系统资源的请求或者请求处于后台时被释放的资源。

import UIAbility from '@ohos.app.ability.UIAbility';export default class EntryAbility extends UIAbility {onForeground() {// 申请系统需要的资源,或者重新申请在onBackground中释放的资源}
}

Background

在UIAbility实例切换至后台,UIAbility界面完全消失之后会触发onBackground回调,比如应用切换到后台的时候,在该回调中我们可以进行耗时操作、资源的释放或者数据的保存。

import UIAbility from '@ohos.app.ability.UIAbility';export default class EntryAbility extends UIAbility {onBackground() {// 释放UI界面不可见时无用的资源,或者在此回调中执行较为耗时的操作// 例如状态保存等}
}

EG:当应用需要开启定位的时候,由于实时定位很耗时和资源,所以当使用应用(处于前台时,开启定位),当将应用切换到后台的时候就关闭定位,然后等待用户切换到前台时,再重新开启定位,以减少资源消耗。

Destory

当关闭应用时候会触发onDestory回调,一般在这个回调进行资源释放、数据的持久化保存(PersistentStorage)等操作。

PersistentStorage持久化,简而言之就是通过状态管理AppStorage来写入数据,然后会选择需要持久化保存的状态,会从AppStorage自动同步到PersistentStorage。 PersistentStorage之所以能保存,是因为它会在用户本地磁盘创建一个文件来保存数据。具体的可以查看这篇文章【HarmonyOS - ArkTS - 状态管理】

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

terminateSelf就是harmonyOS内置的停止当前Ability实例的一个接口。

import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';export default class EntryAbility extends UIAbility {onDestroy() {// 系统资源的释放、数据的保存等}
}

额外的WindowStage生命周期

在第一部分Stage的基本概念图中,我们能看到打开一个应用时UiAbility会绑定WindowStage来创建一个窗口,而在这个创建窗口的阶段,Stage也提供了两个生命周期WindowStageCreate、WindowStageDestroy来表示窗口创建和销毁的状态。

WindowStageCreate

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

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

import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';export default class EntryAbility extends UIAbility {onWindowStageCreate(windowStage: Window.WindowStage) {// 设置WindowStage的事件订阅(获焦/失焦、可见/不可见)// 设置UI界面加载windowStage.loadContent('pages/Index', (err, data) => {// ...});}
}

WindowStageDestroy

对应于onWindowStageCreate()回调。在UIAbility实例销毁之前,则会先进入onWindowStageDestroy()回调,可以在该回调中释放UI界面资源。例如在onWindowStageDestroy()中注销获焦/失焦等WindowStage事件。

import UIAbility from '@ohos.app.ability.UIAbility';
import Window from '@ohos.window';export default class EntryAbility extends UIAbility {// ...onWindowStageDestroy() {// 释放UI界面资源}
}

WindowStageCreate和Create、WindowStageDestroy和Destory的区别?

看了上面的介绍,可能有人产生了正如标题的疑问,想知道两者的区别。事实上当UIAbility实例创建完成之后会立马调用onCreate回调,然后会创建WindowStage进而调用WindowStageCreate回调。同理,在UIAbility组件销毁之前会优先调用WindowStage的WindowStageDestroy回调,然后销毁完成之后会调用Destroy回调。

所以我们的执行顺序是这样的:onCreate -> windowStageCreate -> windowStageDestroy -> Destroy. 详细流程可查看下图
在这里插入图片描述

题外话 - 小广告

有兴趣的同学可以关注一下小弟的公众号,以便能实时交流和学习以及即使反馈问题:【大前端小册子】

在这里插入图片描述

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

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

相关文章

网络摄像头项目

1.OV2640 简介 OV2640 是 OV(OmniVision)公司生产的一颗 1/4 寸的 CMOS UXGA(1632*1232)图像 传感器。该传感器体积小、工作电压低,提供单片 UXGA 摄像头和影像处理器的所有功能。通 过 SCCB 总线控制,可以…

【机器学习】LoRA:大语言模型中低秩自适应分析

LoRA:大型语言模型中的低秩自适应调优策略 一、LoRA的原理与优势二、LoRA在编程和数学任务中的性能表现四、总结与展望 随着人工智能技术的飞速发展,大型语言模型已成为自然语言处理领域的明星技术。然而,这些模型通常拥有数以亿计的参数&…

做好产线工控安全的关键

在现代化工业生产中,产线工控安全是确保生产顺利进行、产品质量稳定、员工生命安全的重要一环。随着信息技术的飞速发展,工控系统面临着越来越多的安全威胁,因此,如何做好产线工控安全成为了摆在我们面前的重要课题。 首先&#x…

使用Python进行高并发压测:技术指南与实战案例

目录 一、引言 二、压测基础知识 压测的目的与类型 压测工具的选择 三、使用Python进行压测 Python压测框架的选择 压测脚本的编写 压测的执行与监控 四、实战案例分析 案例背景介绍 压测计划制定 压测实施过程 结果分析与优化建议 五、常见问题与解决方案 六、…

centos7下卸载MySQL,Oracle数据库

📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 操作系统版本为CentOS 7 使⽤ MySQ…

JVM 运行流程

JVM 是 Java 运行的基础,也是实现一次编译到处执行的关键,那么 JVM 是如何执行的呢? JVM 执行流程 程序在执行之前先要把java代码转换成字节码(class 文件), JVM 首先需要把字节码通过一定的 方式 类加…

文件怎么加密?文件加密软件哪个好用?

在数字化生活和工作中,文件安全已成为不容忽视的话题。 为了保护个人隐私和企业敏感数据不被非法访问或泄露,文件加密成为了不可或缺的手段。 本文将介绍文件加密的基本概念、加密方法以及推荐几款好用的文件加密软件,帮助您为重要文件穿上“…

捋一捋C++中的逻辑运算(一)——表达式逻辑运算

注意,今天要谈的逻辑运算是C语言编程中的“与或非”逻辑运算,不是数学集合中的“交并补”逻辑运算。而编程中的逻辑运算又包括表达式逻辑运算和位逻辑运算,本章介绍表达式逻辑运算,下一章介绍位逻辑运算。 目录 一、几个基本的概…

视频号上怎么卖货?需要直播,还有粉丝吗?一篇文章带你了解!

大家好,我是电商糖果 关于在视频号上卖货,这是大家最常提起的话题。 大家之所以对视频号卖货感兴趣,主要原因还是抖音卖货火起来了。 而视频号是和抖音处于同一个赛道,这两年也在往电商方向发力。 所以大家对视频号推出电商平…

Window11端口开放防火墙

(1)打开控制面板,进入【控制面板\系统和安全\Windows Defender 防火墙】 (2)点击左侧菜单【高级设置】,进入防火墙设置页面 (3)根据需要选择【入站规则】或者【出站规则】&#xff…

ubtun三节点安装k8s

文章目录 修改Ubuntu配置关闭swap:关闭防火墙 安装docker 修改Ubuntu配置 关闭swap: vim /etc/fstab /dev/disk/by-uuid/a1ce2ecf-91f4-4f53-9984-b2af1e9713c5 /boot ext4 defaults 0 1 /swap.img none swap sw 0 0修改/dev/dis…

nestjs 全栈进阶--拦截器

视频教程 23_nestjs中的拦截器_哔哩哔哩_bilibili 1. rxjs 介绍 RxJS(Reactive Extensions for JavaScript)是一款专为JavaScript和TypeScript设计的响应式编程库,它遵循ReactiveX规范,提供了一套强大的工具和API,用…

Mac 使用Docker安装Elasticsearch、Kibana

安装ElasticSearch 通过docker安装es docker pull elasticsearch:8.6.2 在本地创建elasticsearch.yml文件 mkdir /Users/ky/Documents/learn/es/elasticsearch.yml 编辑yml文件内容 http: host: 0.0.0.0 xpack.security.enabled: false xpack.security.enrollment.enabled: t…

Scala 练习一 将Mysql表数据导入HBase

Scala 练习一 将Mysql表数据导入HBase 续第一篇:Java代码将Mysql表数据导入HBase表 源码仓库地址:https://gitee.com/leaf-domain/data-to-hbase 一、整体介绍 HBase特质 连接HBase, 创建HBase执行对象 初始化配置信息:多条(hbase.zookeeper.…

ARM学习(28)NXP 双coreMCU IMX1160学习

笔者最近接触到一块IMXRT1160的双core板子,特依次来记录学习一下 1、IMXRT1160 板子介绍 介绍一下NXP的Demo板子,是一个双core的板子,Cortex-M7和Cortex-M4,总计1MB的RAM空间,256KB的ROM空间,提供了丰富的…

Window10磁盘的分盘和合并

注意: 当我们c盘不够大需要扩大磁盘空间时,当c盘后面没有未划分的磁盘时候,我们是无法进行扩充c盘的,此时,我们可以先删除后面一个磁盘,再进行扩大。 如下:c盘后没有未分配的空间,…

【项目管理常见问题大揭秘】每个管理者都要Get的「五维思维」~

走上管理岗☸要懂得五维思维 💼自我管理——做自己的CEO 严于律己:严格要求自己,注重个人品牌建设 宽以待人:接纳不同观点,提升团队凝聚力 尊重事实:鼓励团队成员发挥优势,避免负面评价 坚守诚…

求助:西莫电子期刊 交流互助 传递

点击上方 “机械电气电机杂谈 ” → 点击右上角“...” → 点选“设为星标 ★”,为加上机械电气电机杂谈星标,以后找夏老师就方便啦!你的星标就是我更新动力,星标越多,更新越快,干货越多! 关注…

Java面经——SpringCloud微服务

SpringCloud SpringCloud的五大组件 注册中心网关远程调用负载均衡熔断降级 谈谈你对SpringCloud的理解 SpringCloud是为了解决微服务架构中出现的一系列服务治理难题的而提出的一套规范,统一了标准。降低了微服务架构的开发难度。有了 Spring Cloud 这样的技术生…

【android 9】【input】【8.发送按键事件2——InputDispatcher线程】

系列文章目录 本人系列文章-CSDN博客 目录 系列文章目录 1.简介 1.1流程介绍 1.2 时序图 2.普通按键消息发送部分源码分析(按键按下事件) 2.1 开机后分发线程阻塞的地方 2.2 InputDispatcher::dispatchOnceInnerLocked 2.3 InputDispatcher::disp…