鸿蒙 从打开一个新窗口到Stage模型的UIAbility组件

打开一个新的窗口

我们首先来实现如何在一个应用中打开一个新窗口,使用的模型是 Stage 模型

  1. 在项目文件里,新建一个 newWindow.ets 新文件
    src/main/ets/pages/newWindow.ets

newWindow.ets文件里面随便写点什么都行,这里是第一步创建的文件

新建的文件可以在 src/main/resources/base/profile/main_pages.json 查看

  1. 新建一个 Ability

src/main/ets 文件=>鼠标右键=>新建=>Ability=>写好新的Ability名字比如这里我写newWindow

  1. ets 文件夹下会出现一个新的 newWindow 文件夹,里面有个新的 newWindow.ets 文件,打开它并修改下面的生命周期函数确保启动文件为第一步新建的文件newWindow.ets
ts 复制代码
onWindowStageCreate(windowStage: window.WindowStage): void {
    windowStage.loadContent('pages/newWindow')
  }
  1. 回到入口文件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

  1. 跳到自定义窗口
    隐式 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

相关推荐
李游Leo10 小时前
HarmonyOS 7 + Spatial Recon Kit-Core File Kit:3DGS 重建产物的原子发布与中断恢复【鸿蒙心迹】
3d·华为·harmonyos
HwJack2011 小时前
【共创稿事节】HarmonyOS 7空间排布原则:视锥、舒适区与可达性
microsoft·华为·harmonyos
李游Leo12 小时前
HarmonyOS 7 Core Vision Kit + Image Kit:超分批处理的 PixelMap 预算、失败降级与结果原子替换【鸿蒙心迹】
harmonyos
李游Leo12 小时前
HarmonyOS 7 AbilityAccessCtrl + ArkUI:权限弹窗重入治理与提审证据链【鸿蒙心迹】
华为·harmonyos
李游Leo13 小时前
HarmonyOS 7 Spatial Recon Kit + Preferences:重建会话中断恢复与脏任务回收【鸿蒙心迹】
华为·harmonyos
李游Leo14 小时前
《HarmonyOS 7 ArkGraphics 3D 空间设计开发实战》03:glTF模型加载、实例复用与资源生命周期【鸿蒙心迹】
3d·harmonyos
李游Leo14 小时前
HarmonyOS 7 + ArkTS-HUKS:精准碰一碰载荷的签名校验与重放窗口【鸿蒙心迹】
华为·harmonyos
花花_115 小时前
HarmonyOS 7 状态手记 01|页面状态别乱放
华为·harmonyos
李游Leo15 小时前
HarmonyOS 7 + Hvigor-Localization Kit:多语言资源占位符签名与回退链路预检【鸿蒙心迹】
harmonyos
李游Leo16 小时前
HarmonyOS 7 AVSession + Float Window:闪控窗播放控制权的会话移交与重复指令去重【鸿蒙心迹】
华为·harmonyos