鸿蒙 UIAbility组件与UI的数据同步和窗口关闭

使用 EventHub 进行数据通信

根据 Stage 模型概念图 UIAbility 先于 ArkUI Page 创建

所以,事件要先 .on 订阅 再 emit 发布

假如现在有页面 Page1 和他的 UIAbility

ts 复制代码
// src/main/ets/page1ability/Page1Ability.ets
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    //通过EventHub对象在UIAbility和它加载的某个页面间共享数据
    let ctx = this.context
    let hub = ctx.eventHub    //事件集中器对象

    //UIAbility监听事件集市中的事件,读取携带的数据
    hub.on('OnPage1Ability', (data:string)=>{
      console.log('--UIAbility监听到页面发布的事件,其中传来数据:', JSON.stringify(data))
    })
  }
ts 复制代码
// src/main/ets/pages/Page1.ets
@Entry
@Component
struct Page1 {
  @State message: string = 'Page1';

  build() {
    Button('在事件集中器对象中发射一个事件').onClick(_=>{
      let ctx = getContext()
      let hub = ctx.eventHub  //事件集中器对象
      //页面发布一个事件,并携带数据
      hub.emit('OnPage1Ability','Page1_Send_Msg')
    })
  }
}

先在 UIAbility 订阅 on ,再在 Page1 发布事件 emit,不要反过来,不然 UIAbility 事件发布后 UI 页面还没生成,拿什么订阅

使用 AppStorage 进行数据同步

应用级别的数据同步

在 HarmonyOS 应用中,最快初始化或使用 AppStorage 的位置通常是应用的入口组件(@Entry 装饰的组件),或是通过单独的状态管理文件集中声明全局状态。

假如我现在随便找个 UIAbility 加它的 UI 来举例吧

忘了,介绍 2 个装饰器先

以下是 AppStorage 的应用全局 UI 状态存储装饰器对比表格,基于 HarmonyOS 官方文档梳理:

特性 @StorageProp @StorageLink
装饰器参数 key: string(常量字符串,必填) key: string(常量字符串,必填)
同步类型 单向(AppStorage→ 组件) 双向(AppStorage↔ 组件)
数据流方向 AppStorage 的值覆盖组件本地值 组件修改同步回 AppStorage,AppStorage 变更同步到所有绑定组件
允许的数据类型 基础类型、对象、数组(不支持 any、undefined/null) 与@StorageProp 相同
初始值要求 必须指定,若 AppStorage 无对应属性则创建并存储 必须指定,规则同@StorageProp
本地修改行为 允许本地修改,但会被 AppStorage 更新覆盖 本地修改直接触发 AppStorage 全局更新
适用场景 全局只读配置(如主题色、语言)、设备信息 需双向交互的状态(如用户登录态、购物车商品数)

ts 复制代码
// src/main/ets/page1ability/Page1Ability.ets
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    AppStorage.setOrCreate('cartCount', 99)
    AppStorage.setOrCreate('themeColor', '#ff13c613') // 确保全局存在
  }
ts 复制代码
// src/main/ets/pages/Page1.ets
import { common } from '@kit.AbilityKit'
@Entry
@Component
struct Page1 {
  @State message: string = 'Page1';
  @StorageProp('themeColor') color: string = '#ff13c613'  // 全局主题色
  @StorageLink('cartCount') count: number = 0  // 购物车商品数

  build() {
    Column({space:10}) {
      Text('当前主题色').fontColor(this.color)
      Button(`商品数量:${this.count}`).onClick(() => this.count++) // 可以修改
    }
  }
}

使用 LocalStorage 进行数据同步

UIAbility 级别的数据同步

介绍 2 个装饰器先

对比项 @LocalStorageProp @LocalStorageLink
同步方向 单向(LocalStorage→ 组件) 双向(LocalStorage↔ 组件)
初始值要求 必须指定,用于初始化 LocalStorage 属性(若不存在) 同左
本地修改影响 本地修改不触发回传,会被 AppStorage 更新覆盖 本地修改自动同步至 LocalStorage,触发全局刷新
适用场景 只读全局配置(如主题色、语言) 动态交互状态(如用户输入、表单数据)

例子不写了,看官网

关闭窗口

ts 复制代码
import { common } from '@kit.AbilityKit'

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

  build() {
    Column({space:10}) {
      Text(this.message)
        .fontSize(30)

      Button('关闭当前窗口').onClick(_=>{
        let ctx = getContext( ) as common.UIAbilityContext //得到页面所在UIAbility对应的UIAbilityContext
        ctx.terminateSelf()
      })

      Button('关闭当前应用的所有窗口,即退出程序').onClick(_=>{
        let ctx = getContext( ) as common.UIAbilityContext
        let appCtx = ctx.getApplicationContext()
        appCtx.killAllProcesses()
      })
    }
  }
}
相关推荐
小雨青年6 小时前
【HarmonyOS 7 平行视界深度实战】06 页面路由、返回栈与多层跳转怎么处理
华为·harmonyos
2501_9197490311 小时前
华为鸿蒙免费刷题软件—小羊免费刷题
华为·harmonyos·鸿蒙
游戏智眼11 小时前
HarmonyOS 7 适配升级:NIM SDK 释放端侧 AI 与网络能力
人工智能·harmonyos
程序猿追13 小时前
react-native-elements 三方库鸿蒙版本适配与使用(MatePad Edge 双模式真机验证)
华为·harmonyos
lqj_本人13 小时前
白泽上手:给小鸿 SE 写一个温控风扇工程
harmonyos
贾伟康13 小时前
【口算王|12】HarmonyOS ArkTS 启动页实战:处理 Splash 到训练首页的稳定切换
harmonyos·arkts·启动优化·uiability·windowstage
万物智能信息科技15 小时前
RK3568 的多路显示移植—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
linux·开发语言·华为·开源·harmonyos
万物智能信息科技16 小时前
MIPI DSI屏幕输出—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
嵌入式硬件·华为·开源·harmonyos·鸿蒙
贾伟康16 小时前
【口算王|13】HarmonyOS ArkTS 应用启动链路实战:从 EntryAbility 到首屏加载保持窗口与路由稳定
harmonyos·arkts·arkui·应用启动·entryability
万物智能信息科技18 小时前
LVDS屏幕输出桌面—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
人工智能·华为·开源·harmonyos·鸿蒙