【HarmonyOS】Stage模型

发布于:2025-07-24 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、概述

Stage 模型是 HarmonyOS 3.1版本开始新增的模型,也是目前HarmonyOS 主推且会长期演进的模型。在该模型中,由于提供了 AbilityStage、WindowStage 等类作应用组件和Window窗口的“舞台”,因此称这种应用模型为Stage模型。

目录概览

在这里插入图片描述

  • AppScope >app.json5:应用的全局配置信息。
  • entry:HarmonyOS工程模块,编译构建生成一个HAP包。
    • src> main >ets: 用于存放ArkTS源码。
    • src > main >ets >entryability: 应用/服务的入口。
    • src > main > ets> pages: 应用/服务包含的页面。
    • src> main>resources:用于存放应用/服务所用到的资源文件。
    • src> main> module.json5:模块应用配置文件。
    • build-profile.json5:当前的模块信息、编译信息配置项,包括buildOption、targets配置等。
    • hvigorfile.ts:模块级编译构建任务脚本,开发者可以自定义相关任务和代码实现。
    • obfuscation-rules.txt:混淆规则文件。
  • oh_modules: 用于存放三方库依赖信息。
  • build-profile.json5:应用级配置信息,包括签名singingConfigs、产品配置products等
  • hvigorfile.ts:应用级编译构建任务脚本。

app.json5应用配置

应用配置在工程的AppScope目录下的app.json5配置文件中

{
  "app": {
    "bundleName": "com.example.stage_ability", //包名
    "vendor": "example", //应用开发厂商描述,不可省略
    "versionCode": 1000000, //版本号,数值越大版本越高
    "versionName": "1.0.0", //给用户看的版本号
    "icon": "$media:layered_image", //应用图标 
    "label": "$string:app_name" //应用名
  }
}

module.json5模块配置

module.json5配置文件,配置ability入口图标和标签配置

二、UIAbility组件

每一个UIAbility实例,都对应于一个最近任务则表中的任务。
UIAbility是一种包含用户界面的应用组件,主要用于和用户进行交互。
一个应用可以有一个 UIAbility 也可以有多个 UIAbility

单UIAbility:任务列表只有一个任务。
多UlAbility:在任务列表中会有多个任务。
在这里插入图片描述

  • 新建模块

在这里插入图片描述 entry是一个模块,TestModule也是一个模块
在这里插入图片描述

  • 新建Ability

在这里插入图片描述
有两个ability一个是entryability,一个是twoability
在这里插入图片描述

三、Ability的生命周期

Ability的生命周期包括Creat、Foreground、Background、Destroy四个状态
WindowStageCreate和WindowStageDestroy为窗口管理器在Ability中管理UI交界面功能的两个生命周期回调,从而实现Ability与窗口之间的弱耦合。
在这里插入图片描述

四、Ability的启动模式

Ability的启动模式是指Ability实例在启动时的不同呈现状态。针对不同的业务场景,系统提供了三种启动模式:

  • singleton(单例模式)
  • standard(标准实例模式)
  • specified(指定单例模式)

1.singleton 启动模式

每次调用startAbility()方法时,如果应用进程中该类型的ability实例已经存在,则复用。系统中只存在一个唯一的Ability实例,即在最近任务列表中只存在一个该类型的Ability实例。此时,应用的Ability实例已创建,当再次调用`startAbility()方法启动该Ability实例时,只会进入该Ability的onNewWant()回调,不会进入其onCreate()和onWindowStageCreate()回调
如需使用,将module.json5配置文件中的’launchType’字段改为’singleton’

2.standard启动模式

使用方法如上
在standard启动模式下,每次调用startAbility()方法时,都会在应用进程中创建一个新的该类型的Ability实例,即在最近任务列表中可以看到有多个该类型的Ability实例。这种情况下,可以将Ability配置为standard
如需使用,将module.json5配置文件中的’launchType’字段改为’standard’

3.specified启动模式

在specified启动模式下,在Ability实例创建之前,允许开发者为该实例创建一个唯一的字符串Key,创建的Ability实例绑定Key之后,后续每次调用startAbility()方法时,都会询问应用使用哪个Key对应的Ability实例来响应startAbility请求。运行时由Ability内部业务决定是否创建多个Ability实例,如果匹配有该Ability实例的Key,则直接拉起与之绑定的Ability实例,否则创建一个新的Ability实例。
如需使用,将module.json5配置文件中的’launchType’字段改为’specified’

五、同模块Ability拉起

一个应用下的两个Ability窗口
Index.ets

import { ComposeListItem, router } from '@kit.ArkUI';
import { common, Want } from '@kit.AbilityKit';
//从一个Ability中唤起另一个Ability(同模块)
//1. 准备want作为UIAbility的启动参数
//2. 利用上下文对象context,调用startAbility 传入want去启动
@Entry
@Component
struct StackExample {
  //获取上下文对象
  context = getContext(this) as common.UIAbilityContext
  @State message: string = 'HelloWorld 首页-聊天应用';

  build() {
    Column() {
      Text(this.message)
        .id('HelloWorld')
        .fontSize($r('app.float.page_text_font_size'))
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(() => {
          router.pushUrl({
            url: 'pages/LoginPage'
          })
        })
      //want
      Button('买菜功能 - 唤起另一个ability')
        .onClick(() => {
          //1. 准备want(参数信息)
          let wantInfo: Want = {
            deviceId: '' ,//空,表示本设备,不涉及跨设备
            bundleName: "com.example.myapplication", // AppScope/app.json 确认
            moduleName: 'entry', // 模块名
            abilityName: "TwoAbility", //src/main/module.json5
            parameters: {
              info: '来自entryAbility'
            }
          }
          //2.利用context startAbility 调起UIAbility
          //返回一个promise对象
          this.context.startAbility(wantInfo)
            .then(() => {
              console.log('startAbility 成功')
            })
            .catch(() => {
              console.log('启动Ability失败')
            })
        })
        .margin(10)
    }
    .height('100%')
    .width('100%')
  }
}

TwoPage.ets

@Entry
@Component
struct TwoPage {
  @State message: string = 'Ability TwoPage';

  build() {
    RelativeContainer() {
      Text(this.message)
        .id('TwoPageHelloWorld')
        .fontSize($r('app.float.page_text_font_size'))
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(() => {
          this.message = 'Welcome';
        })
    }
    .height('100%')
    .width('100%')
  }
}

在这里插入图片描述
在这里插入图片描述
一个应用下一个模块中的两个Ability
在这里插入图片描述

六、跨模块Ability拉起

Entry下的Index.ets

TestModule下的Index.ets

@Entry
@Component
struct Index {
  @State message: string = 'TextModule';

  build() {
    RelativeContainer() {
      Text(this.message)
        .id('HelloWorld')
        .fontSize($r('app.float.page_text_font_size'))
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(() => {
          this.message = 'Welcome';
        })
    }
    .height('100%')
    .width('100%')
  }
}

在这里插入图片描述
在这里插入图片描述
一个应用下的两个模块
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到