华为鸿蒙 UIAbility 组件:构建用户界面的舞台 原创

SameX
发布于 2024-10-21 10:57
浏览
0收藏

本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。

华为鸿蒙系统的阶段模型为开发者提供了一个强大的舞台,而 UIAbility 组件则是这个舞台上最核心的角色,负责构建用户界面并与用户进行交互。

一、UIAbility 组件的定义和功能

UIAbility 是华为鸿蒙系统中用于构建用户界面的应用组件,它负责创建和管理界面元素,响应用户操作,并与用户进行交互。UIAbility 组件可以包含一个或多个页面,每个页面都可以独立加载和卸载,方便地进行界面管理和功能扩展。
UIAbility 组件的主要功能

  • 界面渲染:UIAbility 组件可以使用 ArkUI 库提供的各种组件构建用户界面,例如按钮、文本、图片、列表等。
  • 事件处理:UIAbility 组件可以监听和处理各种用户事件,例如点击、触摸、滑动等。
  • 数据绑定:UIAbility 组件可以使用 Data Binding 框架将界面元素与数据模型进行绑定,实现数据驱动界面更新。
  • 生命周期管理:UIAbility 组件拥有完整的生命周期,包括创建、启动、运行、停止和销毁等状态,开发者可以监听这些生命周期事件并进行相应的处理。
  • 数据同步:UIAbility 组件可以使用多种方式与其他组件进行数据同步,例如 EventHub、AppStorage、LocalStorage 等。
    UIAbility 组件就像是舞台上的演员,通过展示丰富的界面元素和响应用户操作,为用户提供良好的交互体验

二、UIAbility 组件的生命周期管理

UIAbility 组件拥有完整的生命周期,包括以下几个状态:

  • Create:UIAbility 实例创建完成,系统调用 onCreate 回调。
  • Foreground:UIAbility 实例切换到前台,系统调用 onForeground 回调。
  • Background:UIAbility 实例切换到后台,系统调用 onBackground 回调。
  • Destroy:UIAbility 实例销毁,系统调用 onDestroy 回调。
    以下是一些与 UIAbility 组件生命周期相关的代码示例
import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 页面初始化
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  }
  onForeground(): void {
    // 申请系统需要的资源,或者重新申请在onBackground()中释放的资源
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  }
  onBackground(): void {
    // 释放UI不可见时无用的资源,或者在此回调中执行较为耗时的操作
    // 例如状态保存等
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  }
  onDestroy(): void {
    // 系统资源的释放、数据的保存等
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  }
}

开发者可以根据应用需求监听和处理 UIAbility 组件的生命周期事件,进行资源管理、数据同步等操作

三、UIAbility 组件的数据同步机制

UIAbility 组件可以使用多种方式与其他组件进行数据同步,例如 EventHub、AppStorage、LocalStorage 等。

  • EventHub:UIAbility 组件可以使用 EventHub 对象进行事件的发布和订阅,实现组件之间的数据通信。
  • AppStorage:UIAbility 组件可以使用 AppStorage 对象进行应用级别的状态管理,例如保存和读取配置信息、用户数据等。
  • LocalStorage:UIAbility 组件可以使用 LocalStorage 对象进行 UIAbility 级别的状态管理,例如保存和读取界面状态、用户输入等。
    以下是一些使用 EventHub 进行数据同步的代码示例
import { UIAbility, Context, Want, AbilityConstant } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 获取 eventHub
    let eventhub = this.context.eventHub;
    // 执行订阅操作
    eventhub.on('event1', this.eventFunc);
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  }
  // 事件处理函数
  eventFunc(argOne: Context, argTwo: Context): void {
    hilog.info(0x0000, 'testTag', '1. ' + `${argOne}, ${argTwo}`);
    return;
  }
}

开发者可以根据应用需求选择合适的数据同步方式,实现组件之间的数据同步和状态管理

四、UIAbility 组件的启动模式

UIAbility 组件支持三种启动模式:

  • singleton:单实例模式,系统中只有一个该类型的 UIAbility 实例。
  • multiton:多实例模式,系统中可以有多个该类型的 UIAbility 实例。
  • specified:指定实例模式,可以根据指定的 Key 值启动特定的 UIAbility 实例。
    以下是一些与 UIAbility 组件启动模式相关的代码示例
import { UIAbility, AbilityConstant, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 获取 UIAbility 实例的上下文
    let context = this.context;
    // ...
  }
}
export default class SpecifiedAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 获取 UIAbility 实例的上下文
    let context = this.context;
    // ...
  }
}
// 在 EntryAbility 中启动 SpecifiedAbility
let want: Want = {
  deviceId: '', // deviceId为空表示本设备
  bundleName: 'com.example.myapplication',
  abilityName: 'SpecifiedAbility',
  moduleName: 'entry', // moduleName非必选
  parameters: {
    // 自定义信息
    instanceKey: 'uniqueKey'
  },
};
context.startAbility(want).then(() => {
  hilog.info(0x0000, 'testTag', 'Succeeded in starting SpecifiedAbility.');
}).catch((err: BusinessError) => {
  hilog.error(0x0000, 'testTag', `Failed to start SpecifiedAbility. Code is ${err.code}, message is ${err.message}`);
});

开发者可以根据应用需求选择合适的启动模式,实现 UIAbility 组件的灵活启动和管理

五、UIAbility 组件的实例模式和指定实例模式

UIAbility 组件支持两种实例模式:

  • default:默认实例模式,系统根据组件名称创建实例。
  • specified:指定实例模式,系统根据指定的 Key 值创建实例。
    以下是一些与 UIAbility 组件实例模式相关的代码示例
import { AbilityStage, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
export default class MyAbilityStage extends AbilityStage {
  onAcceptWant(want: Want): string {
    // 在被调用方的 AbilityStage 中,针对启动模式为 specified 的 UIAbility 返回一个 UIAbility 实例对应的
    // 一个 Key 值
    // 当前示例指的是 module1 Module 的 SpecifiedAbility
    if (want.abilityName === 'SpecifiedFirstAbility' || want.abilityName === 'SpecifiedSecondAbility') {
      // 返回的字符串 Key 标识为自定义拼接的字符串内容
      if (want.parameters) {
        return `SpecifiedAbilityInstance_${want.parameters.instanceKey}`;
      }
    }
    // ...
    return 'MyAbilityStage';
  }
}

我们可以根据应用需求选择合适的实例模式,实现 UIAbility 组件的灵活实例管理和数据同步
本篇博客介绍了华为鸿蒙 UIAbility 组件的定义、功能、生命周期管理、数据同步机制、启动模式和实例模式。后续文章将深入讲解 UIAbility 组件的具体使用方法和开发技巧
请注意,由于鸿蒙系统版本更新较快,部分功能可能存在变动,请以最新版本官方文档为准

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
标签
收藏
回复
举报
回复
    相关推荐