目录
一、概述
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%')
}
}
一个应用下的两个模块