【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言

在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法 ,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式 ,而非依赖featureAbility。

FA大概是API7之前的开发模型。所谓的开发模型,值得是创建鸿蒙开发工程后,你在什么样子的系统容器和接口上进行开发。

当初我在开发OpenHarmony的时候,最早用的就是FA模型,正是因为FA模型在开发过程中的诸多不方便,大概在API8时,官方推出了Stage模型,进行初步替代。

Stage模型,见名知意,是在系统提供的舞台容器上,进行应用的开发。整理更新的低耦合,高内聚。应用进程的管理也更加合理高效。

本文主要针对Stage模型与FA模型的区别。以及Stage模型如何获取上下文作出讲解。

二、Stage模型与FA模型的核心区别

下面的表格是官方文档的信息梳理,建议针对FA模型有大概了解即可。重点关注Stage模型的内容。

特性 Stage模型(推荐) FA模型(旧版)
应用单元 以AbilityStage为基础,通过UIAbility管理UI组件 以FeatureAbility和PageAbility为主
上下文获取 通过组件context属性或@ohos.app.ability.Context 使用featureAbility.getContext()
生命周期管理 基于UIAbility的生命周期回调(onCreate/onDestroy) 基于FeatureAbility的生命周期

在HarmonyOS 5 的Stage模型开发中,featureAbility属于过时的FA模型接口 ,必须通过组件或UIAbility的context属性获取上下文。这一变化体现了Stage模型"一切皆组件"的设计思想,确保代码结构更简洁、组件化更彻底,同时避免与旧版API的耦合。

三、Stage模型中正确的上下文获取方式

在Stage模型中,组件的上下文(Context)直接通过组件实例的context属性获取 ,无需通过featureAbility。

代码示例:

typescript 复制代码
// Stage模型中,组件内直接通过this.context获取上下文
@Entry
@Component
struct FileStorageDemo {
  // 文件写入
  async writeToFile() {
    try {
      // 正确方式:使用组件的context属性
      const filesDir = await this.context.getFilesDir(); 
      const filePath = `${filesDir}/example.txt`;
      const fd = await fileio.open(filePath, 0o102); // 0o102表示写入模式(O_WRONLY | O_CREAT)
      const data = 'Stage模型下的文件存储示例';
      await fileio.write(fd, data);
      await fileio.close(fd);
      console.log('文件写入成功');
    } catch (error) {
      console.error('文件写入失败:', error);
    }
  }

  // 文件读取
  async readFromFile() {
    try {
      const filesDir = await this.context.getFilesDir(); 
      const filePath = `${filesDir}/example.txt`;
      const fd = await fileio.open(filePath, 0o100); // 0o100表示读取模式(O_RDONLY)
      const buffer = new ArrayBuffer(1024);
      const bytesRead = await fileio.read(fd, buffer);
      const data = new TextDecoder('utf-8').decode(buffer.slice(0, bytesRead));
      await fileio.close(fd);
      console.log('文件内容:', data);
    } catch (error) {
      console.error('文件读取失败:', error);
    }
  }

  build() {
    Column() {
      Button('写入文件').onClick(() => this.writeToFile())
      Button('读取文件').onClick(() => this.writeToFile())
    }
  }
}

上下文获取原则

组件内直接使用this.context(继承自Component的上下文属性)。
UIAbility中使用this.context(代表当前Ability的上下文)。

避免使用任何以featureAbility开头的旧版API。

相关推荐
Georgewu3 小时前
【HarmonyOS 7】 HarmonyOS 应用 Skill创建和编排详解
harmonyos
Georgewu6 小时前
【HarmonyOS 7】 应用 Agent 接入云 A2A 与端 A2A 的实践详解
harmonyos
马剑威(威哥爱编程)11 小时前
【共创稿事节】HarmonyOS 7 Agent 开发实战 05:流式输出做打字机对话
华为·harmonyos
OH_TPC14 小时前
【鸿蒙优选三方库】@ohos/coap:让鸿蒙设备说上 IoT 的母语
物联网·华为·harmonyos·鸿蒙
程序猿追16 小时前
渐变中间那一格怎么算?用 colormath 做个鸿蒙调色器
华为·harmonyos
程序猿追16 小时前
在 HarmonyOS 6 上做了张 3D 翻转卡片,正面背面来回翻
3d·华为·harmonyos
小π军17 小时前
安卓、iOS、鸿蒙三端的理解
android·ios·harmonyos
m0_7381858217 小时前
Flutter 鸿蒙化实战:volume_controller 适配 OpenHarmony,系统音量控制
flutter·华为·harmonyos·鸿蒙
用户1179104883317 小时前
每个会话一个子进程:多会话真并行的架构取舍
开源·harmonyos
m0_7381858218 小时前
Flutter 鸿蒙化实战:webview_cookie_manager 适配 OpenHarmony,WebView Cookie 管理
flutter·华为·harmonyos·鸿蒙