当前位置: 首页 > article >正文

鸿蒙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 的生命周期包括 CreateForegroundBackgroundDestroy 四个状态

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

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

图2 WindowStageCreateWindowStageDestroy 状态

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 资源
  }
}

ForegroundBackground 状态
ForegroundBackground 状态分别在 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() {
    // 系统资源的释放、数据的保存等
  }
}

指定启动页面

在这里插入图片描述

获取上下文

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

数据同步

  1. 使用EventHub - Context(上下文)提供了EventHub对象,提供发布/订阅机制
  2. 使用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网格布局

在这里插入图片描述


http://www.kler.cn/a/395173.html

相关文章:

  • 怎么选择香港服务器的线路?解决方案
  • 【JAVA基础】JVM是什么?
  • 华为云前台用户可挂载数据盘和系统盘是怎么做到的?
  • 自由学习记录(21)
  • 【ACM出版】第四届信号处理与通信技术国际学术会议(SPCT 2024)
  • 【操作系统】守护进程
  • 基于微信小程序的在线疫苗预约的设计与实现,LW+源码+讲解
  • 搜维尔科技:Haption力触觉交互,虚拟机械装配验证
  • 【K8S问题系列 | 9】如何监控集群CPU使用率并设置告警?
  • C++《继承》
  • SpringBoot -- 自动化装配源码
  • 江协科技之STM32驱动1.3寸/0.96寸/0.91寸OLED显示屏介绍
  • js中import引入一个export值可以被修改。vue,react
  • 【计网】计算机网络概述笔记
  • 使用frp工具实现内网穿透
  • 基于yolov8、yolov5的车型检测识别系统(含UI界面、训练好的模型、Python代码、数据集)
  • Scala的迭代器
  • javaWeb小白项目--学生宿舍管理系统
  • C语言不创建中间变量交换2个数
  • win32 / WTL 开发多线程应用,子线程传递大对象给UI线程(主窗口)的方法
  • vite + vue3 + ts解决别名引用@/api/user报错找不到相应的模块
  • 前端系统设计面试题(二)Javascript\Vue
  • 从 MySQL 5.7 到 8.0:理解 GROUP BY 的新规则与实战优化20241112
  • 3D 数组插值 MATLAB
  • vue2 动态路由的实现
  • Leetcode 整数转罗马数字