打开一个新的窗口

我们首先来实现如何在一个应用中打开一个新窗口,使用的模型是 Stage 模型
- 在项目文件里,新建一个
newWindow.ets
新文件
src/main/ets/pages/newWindow.ets
newWindow.ets
文件里面随便写点什么都行,这里是第一步创建的文件
新建的文件可以在 src/main/resources/base/profile/main_pages.json
查看
- 新建一个
Ability
src/main/ets
文件=>鼠标右键=>新建=>Ability
=>写好新的Ability
名字比如这里我写newWindow
ets
文件夹下会出现一个新的newWindow
文件夹,里面有个新的newWindow.ets
文件,打开它并修改下面的生命周期函数确保启动文件为第一步新建的文件newWindow.ets
ts
onWindowStageCreate(windowStage: window.WindowStage): void {
windowStage.loadContent('pages/newWindow')
}
- 回到入口文件
src/main/ets/pages/Index.ets
,加入一个可以跳到新窗口的按钮
ts
import { common } from '@kit.AbilityKit'
@Entry
@Component
struct Index {
build() {
Button('在新窗口打开')
.onClick(_ => {
//getContext() 得到UIAbilityContext对象
//得到页面所在UIAbility对应的UIAbilityContext
// 强行逆转父类 as
let ctx = getContext() as common.UIAbilityContext
//启动一个新的UIAbility
ctx.startAbility({
bundleName: 'com.example.myapplication', //必需!要启动哪个应用下的UIAbility
abilityName: 'newWindow', //必需!要启动的UIAbility名(参考moduels.json5中的名字)
// moduleName: 'entry', //可选的!如果目标Ability在同一个模块下,此属性可以省略
})
})
}
}
// AppScope/app.json5 查看 bundleName
这样就可以打开一个新的窗口了
使用 Want
显式 Want
ts
// 我这里又新建了一个项目,所以有些名字和上面的例子不同
import { common ,Want } from '@kit.AbilityKit'
@Entry
@Component
struct Index {
build() {
Button('在新窗口打开')
.onClick(_ => {
let ctx = getContext() as common.UIAbilityContext
let wantInfo: Want = {
bundleName: 'com.example.quanguokefei',
abilityName: 'Page1',
moduleName: 'entry',
}
//启动一个新的UIAbility
ctx.startAbility(wantInfo)
})
}
}
隐式 Want
- 跳到自定义窗口
隐式 Want 使用 skills 标签来定义需要使用的能力
- 先去目录
src/main/module.json5
修改需要跳转的窗口 - 比如我要跳转的窗口是
Page1
,加入actions: ["iampage1"]
,名字自由取,可以多个
json5
{
name: "Page1",
srcEntry: "./ets/page1/Page1.ets",
description: "$string:Page1_desc",
icon: "$media:layered_image",
label: "$string:Page1_label",
startWindowIcon: "$media:startIcon",
startWindowBackground: "$color:start_window_background",
skills: [
{
actions: ["iampage1", "other_name"],
},
],
}
处理 Want
ts
import { common ,Want } from '@kit.AbilityKit'
@Entry
@Component
struct Index {
build() {
Button('在新窗口打开')
.onClick(_ => {
let ctx = getContext() as common.UIAbilityContext
// 在这里只需要action就行
let wantInfo: Want = {
action:'iampage1'
}
ctx.startAbility(wantInfo)
})
}
}
窗口启动模式
singleton
启动模式为单实例模式,也是默认情况下的启动模式
multiton
启动模式为多实例模式
specified
启动模式为指定实例模式,针对一些特殊场景使用(例如文档应用中每次新建文档希望都能新建一个文档实例,重复打开一个已保存的文档希望打开的都是同一个文档实例)
在 src/main/module.json5
文件中修改
ts
{
"module": {
"abilities": [
{
"name": "Page1Ability",
"launchType": "singleton | multiton | specified"
}
]
}
}
UIAbility 生命周期

执行顺序:
首次启动 onCreate → onWindowStageCreate → onForeground
切换到后台 onBackground
从后台重新打开 onForeground
正常退出应用 onBackground → onWindowStageDestroy → onDestroy
窗口已经存在的情况下,从主程序进入,不是窗口视图 onNewWant → onForeground