【鸿蒙软件开发】UIAbility组件概况、生命周期与启动模式

简介: 【鸿蒙软件开发】UIAbility组件概况、生命周期与启动模式

前言


UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互。

UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口;一个UIAbility组件中可以通过多个页面来实现一个功能模块。每一个UIAbility组件实例,都对应于一个最近任务列表中的任务。


一、UIAbility概况


1.1 概况介绍

UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互

UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口;一个UIAbility组件中可以通过多个页面来实现一个功能模块。每一个UIAbility组件实例,都对应于一个最近任务列表中的任务。


我们可以通过上述的抽象概念下出下面通俗易懂的解释:

UIAbility组件就像是你手机上的一个应用,它负责展示应用的用户界面,你可以通过它来和应用进行互动。每个UIAbility组件可以包含多个不同的界面,就像应用中的不同页面。每次你在手机上打开一个应用,实际上是启动了一个UIAbility组件的实例,这个应用会在最近任务列表中显示。这个机制让你能够轻松切换和管理不同应用和它们的界面。


1.2 声明配置

为使应用能够正常使用UIAbility,需要在module.json5配置文件的abilities标签中声明UIAbility的名称、入口、标签等相关信息。

bcb87b4604db44dab69cd17861499d13.png

以下是我们可以进行设置的参数:

{
  "module": {
    // ...
    "abilities": [
      {
        "name": "EntryAbility", // UIAbility组件的名称
        "srcEntrance": "./ets/entryability/EntryAbility.ts", // UIAbility组件的代码路径
        "description": "$string:EntryAbility_desc", // UIAbility组件的描述信息
        "icon": "$media:icon", // UIAbility组件的图标
        "label": "$string:EntryAbility_label", // UIAbility组件的标签
        "startWindowIcon": "$media:icon", // UIAbility组件启动页面图标资源文件的索引
        "startWindowBackground": "$color:start_window_background", // UIAbility组件启动页面背景颜色资源文件的索引
        // ...
      }
    ]
  }
}


82c38e6e6ad34c1f94672f4e6e96944b.png


二、UIAbility组件生命周期


2.1 基本概念

由于文档可能有点抽象,我将用我的解释来代替文档中的解释:

UIAbility就像是应用中的一个窗口或界面,它有自己的生命周期,就像一个角色有不同的状态。这个生命周期包括四个状态:


Create(创建):当用户打开应用或者切换到应用时,UIAbility被创建。就好像你打开一个应用,应用的界面被呈现在屏幕上。


Foreground(前台):当应用界面处于活跃状态时,它处于前台状态。这就像你正在使用一个应用,它是当前的焦点。


Background(后台):如果你切换到了其他应用,原来的应用就进入了后台状态。UIAbility也会相应地从前台变成后台状态。


Destroy(销毁):当你关闭应用或者应用被系统销毁时,UIAbility也会被销毁。就像你关闭一个应用,它的界面消失了。


这些状态变化可以帮助应用了解UIAbility在不同时刻的状态,从而执行不同的操作或者保持应用的一致性。

dcd93ac86c38409c8a8582ed915194a2.png

他可以用这个流程图表示。


2.2 生命周期状态说明

Create状态

Create状态

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


我们如何去找到他?

如图所示,打开EntryAbility.ts的typescript文件

cdd9e9739dba410abf3a7a89f6fba921.png

d41c6e8eebf44403b120e379ed83f2e0.png

这个即使创建函数,我们可以使用ts的console.log打印一些提示信息:

onCreate(want, launchParam) {
    console.log("i am create!")
  }


WindowStageCreate和WindowStageDestroy状态

我觉得文档对于初学者比较抽象一点,我们可以写成下方的更好理解的话术:

当你的应用程序启动时,系统会为每个UIAbility实例创建一个WindowStage(窗口舞台)。这个WindowStage就像是应用界面的舞台,上面可以加载各种UI元素。


在WindowStage创建完成后,系统会调用onWindowStageCreate()这个回调函数。在这个函数里,你可以设置你的UI界面,比如加载各种页面,设置UI元素的样式等。你还可以订阅WindowStage的事件,比如获得焦点(用户正在与应用交互)或失去焦点(应用不再是用户的焦点)、可见或不可见等。这些事件让你的应用能够响应用户的操作。


在onWindowStageCreate()回调函数中,通常会使用loadContent()方法来加载应用要显示的页面。同时,你也可以根据需要订阅各种WindowStage事件,以便在用户操作发生时做出相应的响应。

当用户退出应用或者应用被系统销毁时,对应的UIAbility实例会被销毁。在这之前,系统会先调用onWindowStageDestroy()回调函数。在这个函数里,你可以释放UI界面所占用的资源,做一些清理工作。比如,你可以在这里注销之前订阅的获得焦点或失去焦点等WindowStage事件,以确保资源被正确释放,应用退出时不会出现问题。


这样,通过在WindowStage的创建和销毁过程中设置相应的回调函数,你的应用就能够在不同的阶段执行不同的操作,从而保证用户体验的一致性和应用的稳定性。


我们还可以通过字和流程图一起来体会。

56a617f8797d47f3afeade593b9f6382.png

Foreground和Background状态

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


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


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


例如应用在使用过程中需要使用用户定位时,假设应用已获得用户的定位权限授权。在UI界面显示之前,可以在onForeground()回调中开启定位功能,从而获取到当前的位置信息。


当应用切换到后台状态,可以在onBackground()回调中停止定位功能,以节省系统的资源消耗。


上述即是这两个函数:

b86e20ad5bcd47ef8521f1d8212e5de4.png

我们在这边如果想体验这两个函数,我们需要使用本地虚拟机/真机,注意:预览模式是查看不了这两个函数执行的


Destroy状态

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

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


三、UIAbility的启动模式


UIAbility的启动模式是指UIAbility实例在启动时的不同呈现状态。针对不同的业务场景,系统提供了三种启动模式:

singleton(单实例模式)

standard(标准实例模式)

specified(指定实例模式)


3.1 singleton启动模式

由于文档中比较抽象,我们可以使用下面的语言来代替:

"Singleton启动模式"是一种应用程序的启动方式,通常是默认的启动方式。在这个模式下,每当你使用startAbility()方法来启动一个UIAbility(用户界面能力)时,如果已经存在相同类型的UIAbility实例,系统会复用现有的实例,而不会创建新的。这意味着在最近任务列表中,只会存在一个该类型的UIAbility实例。


以通俗的方式来说,就好像你有一个应用,当你多次打开同一功能页面时,不会为每次打开都创建新的页面,而是会重新使用已经存在的页面。这样可以节省系统资源,提高应用的运行效率,而且在最近任务列表中只会看到一个相同类型的页面。这个模式通常用于确保应用不会出现大量相同的界面实例,以提供更好的用户体验和系统性能。


说明

应用的UIAbility实例已创建,该UIAbility配置为单实例模式,再次调用startAbility()方法启动该UIAbility实例,此时只会进入该UIAbility的onNewWant()回调,不会进入其onCreate()和onWindowStageCreate()生命周期回调。


进行配置singleton模式

如果需要使用singleton启动模式,在module.json5配置文件中的"launchType"字段配置为"singleton"即可。

9c1ecb1408444fe1a7eaa68ff385d9be.png


3.2 standard启动模式

standard启动模式为标准实例模式,每次调用startAbility()方法时,都会在应用进程中创建一个新的该类型UIAbility实例。即在最近任务列表中可以看到有多个该类型的UIAbility实例。这种情况下可以将UIAbility配置为standard(标准实例模式)。


standard模式设置

standard启动模式的开发使用,在module.json5配置文件中的"launchType"字段配置为"standard"即可。


3.3 specified启动模式

"Specified启动模式"是一种特殊的启动模式,通常用于特定场景,比如文档编辑应用。它允许开发者在创建UIAbility实例之前为该实例指定一个唯一的标识字符串(称为Key)。当UIAbility实例与这个Key绑定之后,在后续调用startAbility()方法时,系统会询问应用要打开哪个与特定Key绑定的UIAbility实例。


这种方式可以理解为每个UIAbility实例都有一个特定的身份标识(Key)。每次开发者启动UIAbility时,系统会根据这个Key来判断是复用已存在的特定Key绑定的UIAbility实例,还是创建一个新的实例。例如,在文档编辑应用中,如果你想新建一个文档,可以使用一个新的Key,这将创建一个新的UIAbility实例;但如果你想打开一个已保存的文档,可以使用该文档对应的Key,这将打开与之绑定的已存在的UIAbility实例。


所以,这种模式允许应用在运行时根据特定的Key来决定是否创建新实例或复用已有实例,以便满足不同的业务需求,比如确保每个文档有自己独立的编辑界面或者确保打开相同文档时共享同一个界面。


说明

应用的UIAbility实例已创建,该UIAbility配置为指定实例模式,再次调用startAbility()方法启动该UIAbility实例,且AbilityStage的onAcceptWant()回调匹配到一个已创建的UIAbility实例。此时,再次启动该UIAbility时,只会进入该UIAbility的onNewWant()回调,不会进入其onCreate()和onWindowStageCreate()生命周期回调。


总结


UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互。


UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口;一个UIAbility组件中可以通过多个页面来实现一个功能模块。每一个UIAbility组件实例,都对应于一个最近任务列表中的任务。


学习这些对于我们来说非常重要:UIAbility组件概况、生命周期与启动模式

相关文章
|
17天前
|
人工智能 物联网 Android开发
【04】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-自定义一个设置输入小部件组件-完成所有设置setting相关的页面-优雅草卓伊凡
【04】优雅草星云物联网AI智控系统从0开发鸿蒙端适配-deveco studio-自定义一个设置输入小部件组件-完成所有设置setting相关的页面-优雅草卓伊凡
153 92
|
19天前
HarmonyOS NEXT - ArkUI: Text组件
Text组件用于展示文本信息并支持子组件Span,可配置多种样式属性。包括设置文本颜色(.fontColor)、尺寸(.fontSize)、字体样式(.fontStyle)、粗细(.fontWeight)、主题(.fontFamily)等。此外,还支持文本对齐(.textAlign)、超长处理(.textOverflow与.maxLines配合)、装饰线(.decoration)等功能。示例代码展示了如何应用这些属性实现丰富的文本效果。
122 72
|
17天前
|
前端开发 API 开发者
harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)
本文由黑臂麒麟(6年前端经验)撰写,介绍ArkTS开发中的常用基础组件与布局组件。基础组件包括Text、Image、Button等,支持样式设置如字体颜色、大小和加粗等,并可通过Resource资源引用统一管理样式。布局组件涵盖Column、Row、List、Grid和Tabs等,支持灵活的主轴与交叉轴对齐方式、分割线设置及滚动事件监听。同时,Tabs组件可实现自定义样式与页签切换功能。内容结合代码示例,适合初学者快速上手ArkTS开发。参考华为开发者联盟官网基础课程。
65 18
harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)
|
18天前
|
数据管理 API 开发者
HarmonyOS:ArkTS RowSplit 组件自学指南
在 ArkTS 开发中,复杂界面布局需求常见,尤其需要灵活调整子组件宽度时,传统方式难以满足动态交互需求。`RowSplit` 组件解决了这一问题,支持横向布局并插入可拖动的分割线,让用户轻松调整子组件宽度,提升体验。本文详细介绍了 `RowSplit` 的功能、接口、属性及使用示例,帮助开发者掌握其用法,并总结了注意事项。通过合理配置,可实现灵活美观的布局效果。希望对您有帮助,欢迎关注、点赞和收藏!
67 31
|
18天前
|
API 开发者
HarmonyOS:ArkTS Path 组件自学指南
在鸿蒙应用开发中,绘制复杂图形常面临传统布局方式难以满足需求的问题。ArkTS 的 Path 组件提供了解决方案,如同一把“神奇画笔”,支持通过灵活的命令和属性绘制直线、曲线、椭圆弧等多样图形。本文详细介绍了 Path 组件从 API Version 7 起的功能特性,包括 `commands`、`fill`、`stroke` 等核心属性,以及各类绘图命令如 `M`(移动)、`L`(直线)、`C`(贝塞尔曲线)等。结合示例代码,展示了如何绘制简单直线到复杂曲线图形,并拓展了颜色、透明度和线条样式的自定义方法。掌握 Path 组件,可为应用带来更丰富生动的视觉体验,助力开发者实现创意绘图需求。
59 21
|
18天前
|
开发者 容器
HarmonyOS NEXT - ArkUI: Button组件
Button是用于响应用户点击操作的按钮组件,支持胶囊型、圆形和普通三种样式。可通过`type`属性设置样式(默认为胶囊型),并使用`stateEffect`控制按压态效果(默认开启)。Button可包含子组件,实现复杂功能按钮;支持自定义文本样式、背景色及边框弧度等样式。示例代码展示了不同类型按钮的创建、子组件嵌套及点击事件处理方法。
70 18
|
18天前
|
数据安全/隐私保护
HarmonyOS NEXT - ArkUI: TextInput组件
TextInput组件是用于输入单行文本的核心组件,广泛应用于登录账号、密码输入及消息发送等场景。支持通过`placeholder`设置提示文字、`text`初始化文本内容以及`controller`控制输入行为。提供多种输入类型(如普通、密码、邮箱、数字)通过`.type()`方法设置,并可通过`.onChange()`监听文本变化。 示例代码展示了基本用法,包括账号、密码和手机号的输入框实现。此外,组件支持字符计数功能,通过`.maxLength()`限制最大字符数、`.showCounter()`显示计数器,并可自定义阈值和高亮边框效果,满足复杂输入场景需求。
68 15
|
18天前
HarmonyOS NEXT - ArkUI: Image组件
Image组件用于渲染和展示图片,丰富界面视觉效果。支持png、jpg、bmp、svg、gif和heif等多种格式,数据源包括本地资源、Resource资源、网络资源、媒体库(file://路径)及PixelMap像素图。使用时需根据资源类型配置路径或权限(如网络图片需声明ohos.permission.INTERNET)。此外,Image组件支持矢量图填充颜色设置(fillColor)和多种缩放模式(objectFit),如Contain、Cover等。示例代码展示了本地、资源、网络图片的加载与样式调整方法。
74 14
|
17天前
|
开发者 容器
HarmonyOS NEXT - @Component自定义组件
在ArkUI中,组件是构成UI的基本单元,分为系统组件和自定义组件。自定义组件通过封装UI与业务逻辑,提升代码复用性和可维护性。其特点包括可组合、可重用及数据驱动UI更新。定义时使用`@Component`装饰器修饰struct,并实现`build()`函数描述UI。可通过`@Entry`标记为页面入口,或用`@Reusable`增强复用能力。成员函数和变量默认私有,状态管理需遵循特定规则。 示例代码展示了通过自定义组件`Home`和`Person`模块化开发UI页面的过程,结合`Tabs`实现多页面切换功能。
62 10
|
17天前
|
API 开发者 UED
HarmonyOS:ComposeTitleBar 组件自学指南
本文详解了鸿蒙开发中 ComposeTitleBar 组件的使用方法与技巧,从基础导入到属性配置,再到实际代码示例,帮助开发者构建美观实用的标题栏。组件自 API Version 10 起支持,具备独立功能结构,核心属性包括 `title`(必填)、`subtitle`(可选)和 `menuItems`(右侧菜单列表)。文章通过具体示例展示了如何配置标题、副标题及菜单项,并提供了交互优化、样式定制与多设备适配的建议。掌握这些内容,可显著提升应用界面体验。如果你有所收获,别忘了点赞收藏!
38 8

热门文章

最新文章