鸿蒙 从打开一个新窗口到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

相关推荐
YM52e10 小时前
鸿蒙 ArkTS 实战|网络常用漫剧主角名称分类表:26 位主角 8 大分类 + 搜索筛选
学习·华为·harmonyos
小雨青年10 小时前
【HarmonyOS 7 悬浮页签深度实战】02 从普通底栏到第一个悬浮页签
华为·harmonyos
whyutianict_vv10 小时前
从零到上架6款APP:AI鸿蒙全栈智能体开发5个月实战复盘(ArkTS/DevEco/AGC全流程)
人工智能·个人开发·harmonyos
OH_TPC11 小时前
HarmonyOS APP开发---"启动秀"应用引导页App,需要用到这个库
harmonyos
见山是山-见水是水13 小时前
围绕HTTP 网络请求实战构建原生体验:设计取舍、实现与排错
网络·网络协议·http·华为·harmonyos
见山是山-见水是水13 小时前
拆解网络缓存策略设计:原生鸿蒙页面的实现路径与调试方法
http·缓存·华为·harmonyos
蓝速科技14 小时前
蓝速鸿蒙信创终端长效流畅性深度评测
arm开发·华为·harmonyos
YM52e14 小时前
鸿蒙 ArkTS 实战|万能绿茶通用词汇库:20 词六大类 + 搜索筛选 + 潜台词解析
学习·华为·harmonyos
2301_7803567014 小时前
开源鸿蒙+智慧医疗:全视通如何实现门诊与住院场景的设备互联互通?
华为·开源·harmonyos
贾伟康15 小时前
【中国方言题库|13】HarmonyOS ArkTS 应用启动链路实战:从 EntryAbility 到首屏加载保持窗口与路由稳定
harmonyos·arkts·appstorage·应用启动·uiability