鸿蒙应用开发-组件、页面和UIAbility
Stage模型
首先给大家介绍一下在鸿蒙应用开发中基本应用程序的包结构,在API7
时FA
(Feature Ability)模型开始,到了API9
新增了目前主推并且会长期演进的Stage
模型。Stage
模型应用程序包结构如下图所示:
-
一个应用程序(
App
)可以分成多个模块(Module
),模块(Module
)编译后的产物叫做 HAP (Harmony Ability Package
) -
模块(
Module
)分成两种,一种是主模块(Entry
),另一种是功能模块(Feature
)。同一个应用,同一设备类型只支持一个主模块。功能模块可以是没有,也可以有多个。 -
一个应用可以有多个
HAP
,所有的HAP
合在一起成为 一个Bundle
,而bundleName
就是应用的唯一标识。4.后期项目上架到应用商店时,需要将
Bundle
打包成一个.app
后缀的文件。
核心构成
下图就是Stage
模型工程目录结构:
这边就给大家介绍最常用的几个文件:
AppScope->app.json5
:应用的全局配置信息entry
:HarmonyOS工程模块,编译构建生成一个HAP包src->main->ets
:用于存放ArkTS
源码src->main->ets->entryability
:应用/服务的入口src->main->ets->pages
:应用/服务包含的页面src->main->ets->resources
:用于存放应用/服务所用到的资源文件src->main->module.json5
:模块配置文件
页面和自定义组件的生命周期
- 自定义组件:
@Component
装饰的UI
单元 - 页面:就是应用的
UI
页面。@Entry
装饰的自定义组件作为页面的
组件生命周期:
aboutToAppear
:函数在创建自定义组件的新实例后,在执行其build
函数之前执行。aboutToDisappear
:函数在自定义组件析构销毁之前执行
@Component
struct SonCom {
aboutToAppear(): void {
console.log('组件创建')
}
aboutToDisappear(): void {
console.log('组件销毁')
}
build() {
Column() {
Text('我是子组件')
}
.width(200)
.height(200)
.border({ width: .5 })
}
}
@Entry
@Component
struct LiteFunc01 {
@State show: boolean = false
build() {
Column() {
Text('组件的生命周期')
Button('切换子组件显示')
.onClick(() => {
this.show = !this.show
})
if (this.show) {
SonCom()
}
}
}
}
页面生命周期:
onPageShow
:页面每次显示时触发一次onPageHide
:页面每次隐藏触发一次onBackPress
:当用户点击返回按钮时触发
!!!因为@Entry 也是@Component组件,所以页面组件同时拥有自定义组件的生命周期
@Entry
@Component
struct LiteFunc01 {
@State show: boolean = false
aboutToAppear(): void {
console.log('组件创建')
}
onPageShow() {
console.log("页面显示")
}
onPageHide() {
console.log("页面隐藏")
}
onBackPress() {
console.log("按了后退键")
// 阻止点击返回的操作,
return true
}
aboutToDisappear(): void {
console.log('组件销毁')
}
build() {
Column({space:30}) {
Text('页面的生命周期')
}
}
}
图标配置
/entry/src/main/module.json5
图标名称配置
/entry/src/main/module.json5
UIAbility
指定启动页面
entry/src/main/ets/entryability/EntryAbility.ets
生命周期
onCreate
:Ability
创建时回调,执行初始化业务逻辑操作。onDestory
:Ability
生命周期回调,在销毁时回调,执行资源清理等操作。onWindowStageCreate
:当WindowStage
创建后调用。onWindowStageDestory
:当WindowStage
销毁后调用。onForeground
:Ability
生命周期回调,当应用从后台转到前台时触发。onBackground
:Ability
生命周期回调,当应用从前台转到后台时触发。
下面带大家验证一下这个流程,我会在每个事件中都加入日志输出:
测试代码:
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
console.log('onCreate')
}
onDestroy(): void {
console.log('onDestroy')
}
onWindowStageCreate(windowStage: window.WindowStage): void {
// Main window is created, set main page for this ability
windowStage.loadContent('pages/Index', (err) => {
console.log('onWindowStageCreate')
if (err.code) {
hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
return;
}
});
}
onWindowStageDestroy(): void {
// Main window is destroyed, release UI related resources
console.log('onWindowStageDestroy')
}
onForeground(): void {
// Ability has brought to foreground
console.log('onForeground')
}
onBackground(): void {
// Ability has back to background
console.log('onBackground')
}
}
创建多个Ability
按下图直接创建即可:
设置默认启动的Ability
/entry/src/main/module.json5
-
调整配置:
配置中增加:exported 和 skills ,并移除默认Ability 中对应的配置
-
调整顺序:
如果多个 Ability 中都设置了exported 和 skills ,那么调整他们在 abilities 数组中的顺序即可,排名靠前的先启动
启动新的Ability
这边建议大家直接C+V官网写好的跳转代码,手搓有点麻烦(大神当我没说)
官方文档:developer.huawei.com/consumer/cn…
这边需要注意几点:
- 首先两个Ability一开始的启动页面都需要指定
- 编写按钮,点击事件进行跳转
- 是否成功下图作为参照(当你后台可以同时开启两个页面时即为成功)
启动不同模块的Ability
过程与启动相同模块的Ability
类似
- 创建新的模块
entry
模块配置,需要把新建的entry1
也勾选上
- 编写跳转事件
不知不觉又要和大家说再见了,如果喜欢我的文章就请给我点个赞和关注吧!!!让我们下期见💕💕💕