openharmony 鸿蒙 arkts-global-interface

2025-06-16 浏览 (1)

使用UI上下文接口操作界面(UIContext)

概述

OpenHarmony支持Stage模型后,存在一个ArkTS引擎里面运行多个ArkUI实例的场景。此时,一个ArkTS引擎下可能会有多个Ability,每个Ability可能有多个Window,每个Window通过loadContent加载页面,生成一个ArkUI实例。

图1 多实例关系图
multi-instance

UI上下文不明确

UI上下文不明确是指调用ArkUI全局接口时,调用点无法明确指认UI实例的问题。ArkUI全局接口在FA模型中开放,该模型默认支持单个ArkUI实例,不涵盖多实例场景。当框架切换至Stage模型后,原本在FA模型下开放的ArkUI全局接口,在调用时无法确定运行的具体实例。接口仅能依据调用链确认有效的UI实例,若无法追踪到UI实例,则存在UI上下文不明确的问题。因为这些接口的实现依赖于ArkUI实例的相关信息,UI上下文不明确会导致运行时产生非预期行为。

为了解决此类问题,ArkUI针对Stage模型推出了替代接口,以便满足开发者在多ArkUI实例场景下的诉求。可以通过获取UIContext调用对应的多实例替代接口,以解决多实例场景下调用点无法明确指认UI实例的问题。其中UIContext是ArkUI实例的上下文,它是由窗口创建的用于管理所有UI的对象,并且该对象由创建的窗口所持有和管理。

接口替代关系

部分多实例替代接口如下表所示,UIContext实例支持的全量接口以UIContext中描述为准。

全局接口替代接口说明
@ohos.animatorcreateAnimator自定义动画控制器
@ohos.arkui.componentSnapshotgetComponentSnapshot组件截图
@ohos.arkui.componentUtilsgetComponentUtils组件工具类
@ohos.arkui.dragControllergetDragController拖拽控制器
@ohos.arkui.inspectorgetUIInspector组件布局回调
@ohos.arkui.observergetUIObserver无感监听
@ohos.fontgetFont自定义字体
@ohos.measuregetMeasureUtil文本计算
@ohos.mediaquerygetMediaQuery媒体查询
@ohos.promptActiongetPromptAction弹窗
@ohos.routergetRouter页面路由
AlertDialogshowAlertDialog警告弹窗
ActionSheetshowActionSheet列表选择弹窗
CalendarPickerDialog不支持日历选择器弹窗
DatePickerDialogshowDatePickerDialog日期滑动选择弹窗
TimePickerDialogshowTimePickerDialog时间滑动选择器弹窗
TextPickerDialogshowTextPickerDialog文本滑动选择器弹窗
ContextMenugetContextMenuController菜单控制
vp2px/px2vp/fp2px/px2fp/lpx2px/px2lpxvp2px/px2vp/fp2px/px2fp/lpx2px/px2lpx像素单位转换
focusControlgetFocusControl焦点控制
cursorControlgetCursorControl光标控制
getContextgetHostContext获取当前的Ability的Context
LocalStorage.getSharedgetSharedLocalStorage获取Ability传递的Storage
animateToanimateTo显式动画
animateToImmediately不支持显式立即动画

接口切换方法

下述示例,实现了在具体窗口内弹出Toast。ArkUI可感知到是在当前页面下调用,找到对应的UI实例。但是,如果一些复杂场景的起始调用不在页面中,经过了异步调用,作用的实例就可能出现行为不明确的问题。

import { promptAction } from '@kit.ArkUI'

@Entry
@Component
struct Index {
  build() {
    Row() {
      Button()
        .onClick(() => {
          promptAction.showToast({            
            message: 'Message Info',
            duration: 2000 
          });
        })
    }
  }
}

下述示例,callNative是Node-API方法,回调如果是由C侧异步触发,执行时无法感知当前页面信息,无法确定响应的UI实例。

import { promptAction } from '@kit.ArkUI'

@Entry
@Component
struct Index {
  build() {
    Row() {
      Button()
        .onClick(() => {
          bridge.callNative("xxxx", ()=> {
            promptAction.showToast({            
              message: 'Message Info',
              duration: 2000 
            });
          })
        })
    }
  }
}

针对上述问题,可使用组件内置方法getUIContext直接获取当前组件所在的UIContext,并使用UIContext中的getPromptAction接口获取与实例绑定的对象,使得Toast绑定到具体的实例。

@Entry
@Component
struct Index {
  build() {
    Row() {
      Button()
        .onClick(() => {
          let uiContext = this.getUIContext();
          let prompt = uiContext.getPromptAction();
          bridge.callNative("xxxx", ()=> {
            prompt.showToast({            
              message: 'Message Info',
              duration: 2000 
            });
          })
        })
    }
  }
}

对于UIContext中没有提供替代的接口(例如,CalendarPickerDialog和animateToImmediately),或者开发者自定义实现的业务行为与多实例相关,需要和实例绑定时(例如,一个代码段),可以使用UIContext的runScopedTask方法将接口或一段代码段包裹起来。

UIContext接口说明
runScopedTask执行绑定实例的闭包。

上文的示例也可以使用如下方法实现。

// 执行绑定实例的闭包
import { promptAction } from '@kit.ArkUI'

@Entry
@Component
struct Index {
  build() {
    Row() {
      Button()
        .onClick(() => {
          let uiContext = this.getUIContext();
          uiContext.runScopedTask(() => {
            promptAction.showToast({            
              message: 'Message Info',
              duration: 2000 
            });
          })
        })
    }
  }
}

你可能感兴趣的鸿蒙文章

harmony 鸿蒙ArkUI(方舟UI框架)

harmony 鸿蒙全屏启动原子化服务组件(FullScreenLaunchComponent)

harmony 鸿蒙弧形按钮 (ArcButton)

harmony 鸿蒙动画衔接

harmony 鸿蒙动画概述

harmony 鸿蒙帧动画(ohos.animator)

harmony 鸿蒙实现属性动画

harmony 鸿蒙属性动画概述

harmony 鸿蒙弹出框概述

harmony 鸿蒙模糊

  • 所属分类: 后端技术
  • 本文标签: 软件 鸿蒙
  • 版权声明: 本文链接 https://seaxiang.com/blog/7pVKOa