鸿蒙UIAbility
UIAbility 是什么
UIAbility 是 HarmonyOS 中一种包含 UI 界面的应用组件,主要用于与用户进行交互。它也是系统调度的基本单元,为应用提供绘制界面的窗口。一个 UIAbility 组件中可以通过多个页面来实现一个功能模块。
每一个 UIAbility 组件实例,都对应于一个最近任务列表中的任务。因此,对于开发者而言,可以根据具体的场景选择单个或多个 UIAbility。
如何在 UIAbility 组件中添加页面
在 DevEco Studio 中创建的 UIAbility 中,该 UIAbility 实例默认会加载 Index 页面,你可以根据需要将 Index 页面路径替换为需要的页面路径。此外,所有创建的页面都需要在 main_pages.json 配置,通过 DevEco Studio 创建的页面会自动配置,若手动复制 page 文件到 entry > src > main > ets > pages 目录,则需要在 main_pages.json 文件中添加对应的页面路径。
页面间的跳转和数据传递
在 HarmonyOS 中,页面路由指在应用程序中实现不同页面之间的跳转和数据传递。HarmonyOS 提供了 Router 模块,通过不同的 url 地址,可以方便地进行页面路由,轻松地访问不同的页面。Router 模块提供了两种跳转模式,分别是 router.pushUrl() 和 router.replaceUrl()。
//跳转
router.pushUrl({
//跳转到的url
url: CommonConstants.SECOND_URL,
// 传递的对象 创建一个新的 routerParams 对象,并设置其中的 src 属性为 CommonConstants.SECOND_SRC_MSG
params: new routerParams(CommonConstants.SECOND_SRC_MSG)
}).catch((error:Error) => {
// 如果页面跳转失败,使用 Logger.info 方法打印错误信息到控制台
Logger.info(TAG, 'IndexPage push error' + JSON.stringify(error));
});
//点击事件
.onClick(() => {
// 设置按钮点击事件的处理函数为一个箭头函数,该函数会执行 router.back() 方法进行页面跳转
router.back();
})
UIAbility 的生命周期
UIAbility 的生命周期主要包括以下四个状态:
1.Create:在应用加载过程中,UIAbility 实例创建完成时触发,系统会调用 onCreate()回调。可以在该回调中进行应用初始化操作,例如变量定义、资源加载等,用于后续的 UI 界面展示。
2.Foreground:表示 UIAbility 实例进入前台,用户可以与应用进行交互。在进入 Foreground 之前,系统会创建一个 WindowStage,WindowStage 创建完成后会触发 onWindowStageCreate()回调,可以在该回调中设置 UI 界面加载和订阅 WindowStage 的事件。
3.Background:表示 UIAbility 实例进入后台,用户不可与应用进行交互。当应用从 Foreground 切换到 Background 时,系统会调用 onBackground()回调,可以在该回调中释放资源或执行其他后台操作。
4.Destroy:表示 UIAbility 实例被销毁,系统会调用 onDestroy()回调,可以在该回调中释放资源或执行其他清理操作。
在不同状态之间转换时,系统会调用相应的生命周期回调函数。合理管理 UIAbility 的生命周期可以提高应用的性能和用户体验。当用户打开、切换和返回到应用时,应用中的 UIAbility
实例会在其生命周期的不同状态之间转换。UIAbility
类提供了一系列回调,通过这些回调可以知道当前 UIAbility
实例的某个状态发生改变,会经过 UIAbility
实例的创建和销毁,或者 UIAbility
实例发生了前后台的状态切换。
UIAbility
的生命周期包括 Create
、Foreground
、Background
、Destroy
四个状态
Create
状态为在应用加载过程中,UIAbility
实例创建完成时触发,系统会调用 onCreate()
回调。可以在该回调中进行页面初始化操作,例如变量定义资源加载等,用于后续的 UI 展示。
import type AbilityConstant from '@ohos.app.ability.AbilityConstant';
import UIAbility from '@ohos.app.ability.UIAbility';
import type Want from '@ohos.app.ability.Want';
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
的事件订阅。
图2 WindowStageCreate
和 WindowStageDestroy
状态
在 onWindowStageCreate()
回调中通过 loadContent()
方法设置应用要加载的页面,并根据需要调用 on('windowStageEvent')
方法订阅 WindowStage
的事件(获焦/失焦、可见/不可见)。
import Logger from '../utils/Logger';
import UIAbility from '@ohos.app.ability.UIAbility';
import window from '@ohos.window';
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: // 切到前台
Logger.info('windowStage foreground.');
break;
case window.WindowStageEventType.ACTIVE: // 获焦状态
Logger.info('windowStage active.');
break;
case window.WindowStageEventType.INACTIVE: // 失焦状态
Logger.info('windowStage inactive.');
break;
case window.WindowStageEventType.HIDDEN: // 切到后台
Logger.info('windowStage background.');
break;
default:
break;
}
});
} catch (exception) {
Logger.error('Failed to enable the listener for window stage event changes. Cause:' + JSON.stringify(exception));
}
// 设置 UI 加载
windowStage.loadContent('pages/Index', (err, data) => {
//...
});
}
}
说明:
WindowStage
的相关使用请参见窗口开发指导。
对应于 onWindowStageCreate()
回调。在 UIAbility
实例销毁之前,则会先进入 onWindowStageDestroy()
回调,可以在该回调中释放 UI 资源。
import Logger from '../utils/Logger';
import UIAbility from '@ohos.app.ability.UIAbility';
import window from '@ohos.window';
import type { BusinessError } from '@ohos.base';
export default class EntryAbility extends UIAbility {
windowStage: window.WindowStage | undefined = undefined;
//...
onWindowStageCreate(windowStage: window.WindowStage): void {
this.windowStage = windowStage;
//...
}
onWindowStageDestroy() {
// 释放 UI 资源
}
}
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 '@ohos.app.ability.UIAbility';
export default class EntryAbility extends UIAbility {
//...
onForeground(): void {
// 申请系统需要的资源,或者重新申请在onBackground()中释放的资源
}
onBackground(): void {
// 释放 UI 不可见时无用的资源,或者在此回调中执行较为耗时的操作
// 例如状态保存等
}
}
Destroy
状态
Destroy
状态在 UIAbility
实例销毁时触发。可以在 onDestroy()
回调中进行系统资源的释放、数据的保存等操作。
例如调用 terminateSelf()
方法停止当前 UIAbility
实例,从而完成 UIAbility
实例的销毁;或者用户使用最近任务列表关闭该 UIAbility
实例,完成 UIAbility
的销毁。
import UIAbility from '@ohos.app.ability.UIAbility';
export default class EntryAbility extends UIAbility {
//...
onDestroy() {
// 系统资源的释放、数据的保存等
}
}
指定启动页面
获取上下文
数据同步
- 使用EventHub - Context(上下文)提供了EventHub对象,提供发布/订阅机制
- 使用AppStorage/LocalStorage - App全局/页面级状态存储
- 再UIAbility中使用 eventHub.on()
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// 页面初始化
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
//获取UIAbility实例的上下文
let context = this.context
//获取eventHub
let eh = context.eventHub
//1.注册一个事件"event1",绑定一个监听函数,处理逻辑
eh.on('event1', this.eventFunc)
//2.直接使用箭头函数处理
eh.on('event1', (data: string) => {
//处理逻辑
})
}
//event1对应的监听函数
eventFunc(arg1: Context, arg2: Context) {
hilog.info(0x0000, 'eventHubTag', `监听到event1的事件参数: ${arg1}, ${arg2}`)
}
- 在页面中使用 eventHub.emit() 方法触发该事件
private context = getContext(this) as common.UIAbilityContext
emitEvent1() {
this.context.eventHub.emit('event1') //不带参数
this.context.eventHub.emit('event1', 2024) //带参数:1个
this.context.eventHub.emit('event1', 999, '这是UIAbility的课') //带参数:2个
}
Text(this.message)
.onClick(() => {
this.emitEvent1()
})
- 使用EventHub.off()方法取消该事件订阅
UIAbility间交互
在功能模块间跳转时,可以启动其他UIAbility,或其他应用的(如启动三方支付)
启动应用内的UIAbility
- 假设有两个:EntryAbility和FuncAbility,需要从EntryAbility的页面中启动FuncAbility。
在entry中新建一个Ability: FuncAbility
在FuncAbility的onCreate()或onNewWant()中,接收EntryAbility传递过来的参数。
在FuncAbility业务完成之后,在用terminateSelf()结束自己。
启动应用内的UIAbility并获取返回结果
- 在EntryAbility中,调用startAbilityForResult()接口启动FuncAbility,异步回调中的data用于接收FuncAbility停止自身后返回给EntryAbility信息
Text组件示例
弹性盒
Grid网格布局
原文地址:https://blog.csdn.net/woyebuzhidao321/article/details/143692187
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!