前言

在鸿蒙应用开发过程中,我们经常会遇到需要获取UI上下文实例或者在非UI上下文中调用UI相关方法的场景。随着HarmonyOS NEXT的不断发展,UIContext API为我们提供了更加优雅的解决方案。本文将详细介绍如何使用UIContext中对应的接口获取与实例绑定的对象,以及如何以全屏方式拉起元服务。

一、UIContext概述

1.1 什么是UIContext?

在HarmonyOS NEXT的Stage模型中,WindowStage/Window通过loadContent接口加载页面并创建UI实例,将页面内容渲染到关联的窗口中。每个UI实例都与特定窗口一一关联。UIContext提供了与特定UI实例关联的执行上下文,确保UI操作能够在正确的上下文中执行。

1.2 为什么需要UIContext?

一些全局的UI接口需要依赖具体的UI执行上下文。在非UI页面(如UIAbility)或异步回调中调用这类接口时,系统可能无法跟踪到当前UI的上下文,导致接口执行失败。UIContext解决了这个问题,它让我们能够明确指定UI操作的执行上下文。

二、获取UIContext实例的方法

2.1 在组件内获取UIContext

在有@Component装饰器的组件中,可以直接使用this.getUIContext()方法获取UIContext实例:

typescript

@Component
struct MyComponent {private uiContext: UIContext = this.getUIContext();build() {// 组件内容}
}

2.2 全局获取和使用UIContext

在EntryAbility.ts的onWindowStageCreate方法中获取UIContext实例并存储到AppStorage中,方便全局使用:

typescript

// EntryAbility.ts
onWindowStageCreate(windowStage: window.WindowStage): void {hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onWindowStageCreate');windowStage.loadContent('pages/Index', (err) => {// 获取UIContext并存储到AppStoragelet context = windowStage.getMainWindowSync().getUIContext();AppStorage.setOrCreate('UIContext', context);if (err.code) {hilog.error(DOMAIN, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err));return;}hilog.info(DOMAIN, 'testTag', 'Succeeded in loading the content.');});
}// 在其他类或组件中使用
const uiContext: UIContext = AppStorage.get('UIContext') as UIContext;

2.3 通过window获取UIContext

从API version 10开始,可以使用ohos.window中的getUIContext()方法获取UIContext实例:

typescript

import window from '@ohos.window';// 获取当前窗口的UIContext
let windowInstance: window.Window = // 获取window实例
let uiContext: UIContext = windowInstance.getUIContext();

三、UIContext的核心接口及使用示例

3.1 获取与实例绑定的对象

UIContext提供了多种方法获取与特定UI实例绑定的对象:

获取Font对象

typescript

let font: Font = uiContext.getFont();
获取MediaQuery对象

typescript

let mediaQuery: MediaQuery = uiContext.getMediaQuery();
获取Router对象

typescript

let router: Router = uiContext.getRouter();
获取PromptAction对象

typescript

let promptAction: PromptAction = uiContext.getPromptAction();
获取ComponentUtils对象

typescript

let componentUtils: ComponentUtils = uiContext.getComponentUtils();
获取UIInspector对象

typescript

let uiInspector: UIInspector = uiContext.getUIInspector();

3.2 使用animateTo创建动画

animateTo接口可以指定由于闭包代码导致的状态变化插入过渡动效:

typescript

// xxx.ets
@Entry
@Component
struct AnimateToExample {@State widthSize: number = 250;@State heightSize: number = 100;@State rotateAngle: number = 0;private flag: boolean = true;build() {Column() {Button('change size').width(this.widthSize).height(this.heightSize).margin(30).onClick(() => {if (this.flag) {uiContext.animateTo({duration: 2000,curve: Curve.EaseOut,iterations: 3,playMode: PlayMode.Normal,onFinish: () => {console.info('play end');}}, () => {this.widthSize = 150;this.heightSize = 60;});} else {uiContext.animateTo({}, () => {this.widthSize = 250;this.heightSize = 100;});}this.flag = !this.flag;});}.width('100%').margin({ top: 5 });}
}

3.3 使用showAlertDialog显示警告弹窗

typescript

uiContext.showAlertDialog({title: 'title',message: 'text',autoCancel: true,alignment: DialogAlignment.Bottom,offset: { dx: 0, dy: -20 },gridCount: 3,confirm: {value: 'button',action: () => {console.info('Button-clicking callback');}},cancel: () => {console.info('Closed callbacks');}}
);

3.4 使用showActionSheet显示列表弹窗

typescript

uiContext.showActionSheet({title: '标题',message: '内容',autoCancel: true,confirm: {value: '确认',action: () => {console.info('确认按钮点击回调');}},// 其他配置...}
);

四、全屏方式拉起元服务的方法

4.1 鸿蒙中常见的拉起方式对比

在HarmonyOS中,有多种方式可以拉起应用或元服务,下表对比了主要的几种方式:

拉起方式描述典型用途适用场景参数要求特点与限制
openLink使用URL Scheme唤起目标应用三方跳转、H5打开App适用于已注册URI的目标服务需注册scheme,例如myapp://page?param=x通用性强,依赖目标注册URI,不能确保一定成功
startAbility显式或隐式Want启动指定UIAbility跨应用模块调用、能力联动应用内跳转、已知bundleName的组件跳转需指定bundleName、abilityName、action功能强大,多用于深度集成,适合系统内交互
openAtomicService拉起免安装元服务(原子服务)快速使用外部工具/服务一键唤起如扫码、识图、剪辑等元服务设置action、serviceIdentity、appId等支持免安装,需注册为原子服务,调用链受限
FullScreenLaunchComponent以全屏方式嵌入式启动目标元服务沉浸式嵌入服务元服务间联动,如地图内嵌房产展示需配置FullScreenLaunchComponent权限仅元服务可用,适配复杂、须授权,鸿蒙6前存在兼容性问题

4.2 使用FullScreenLaunchComponent全屏拉起元服务

FullScreenLaunchComponent允许以全屏方式嵌入式启动元服务组件,当被拉起方授权使用方可以嵌入式运行元服务时,使用方可以全屏嵌入式运行元服务;未授权时,使用方跳出式拉起元服务。

基本使用

typescript

import { InnerFullScreenLaunchComponent, LaunchController } from '@kit.ArkUI';@Entry
@Component
struct Index {appId1: string = '5765880207853275505'; // 元服务appIdappId2: string = '5765880207854372375'; // 另一个元服务appId@BuilderColumnChild() {Column() {Text('InnerFullScreenLaunchComponent').fontSize(16).margin({top: 100});Button('启动日出日落元服务').onClick(() => {this.controller.launchAtomicService(this.appId2, {});}).height(30).width('50%').margin({top: 50});Button('启动充值元服务').onClick(() => {let appId = '5765880207853275489';this.controller.launchAtomicService(appId, {});}).height(30).width('50%').margin({top: 50});}.backgroundColor(Color.Pink).height('100%').width('100%');}controller: LaunchController = new LaunchController();build() {Column() {InnerFullScreenLaunchComponent({content: this.ColumnChild,controller: this.controller,});}.width('100%').height('100%');}
}
实现原理
  1. 导入模块:首先需要导入InnerFullScreenLaunchComponentLaunchController

  2. 创建LaunchController:实例化一个拉起控制器,用于控制元服务的拉起行为。

  3. 构建界面内容:使用@Builder装饰器构建要显示的内容,通常包含触发拉起操作的按钮。

  4. 调用launchAtomicService方法:通过控制器的launchAtomicService方法拉起指定的元服务,需要传入元服务的appId和可选参数。

注意事项
  • 系统接口InnerFullScreenLaunchComponent是系统接口,从API Version 12开始支持。

  • 继承要求:如果要在元服务中实现嵌入式运行,必须继承自EmbeddableUIAbility,否则系统无法保证元服务功能正常。

  • 权限配置:需要配置FullScreenLaunchComponent权限。

  • 兼容性:在HarmonyOS 6之前存在兼容性问题,开发时需要注意。

4.3 使用openAtomicService拉起元服务

除了全屏嵌入式拉起,还可以使用openAtomicService方法直接拉起元服务:

typescript

openAtomicService(appId: string, parameters?: Record<string, Object>, context?: common.UIAbilityContext) {const contextP = context ?? getContext() as common.UIAbilityContext;const options: AtomicServiceOptions = {displayId: 0,parameters};contextP.openAtomicService(appId, options).then(() => {console.log('openAtomicService success');}).catch((err: BusinessError) => {console.error(`openAtomicService failed: ${err.code}, ${err.message}`);});
}// 示例调用
Button('拉起学习通元服务').onClick(() => {this.openAtomicService('5765880207855627899');
});

五、实战案例:结合UIContext与全屏拉起元服务

下面是一个综合案例,演示如何在异步回调中使用UIContext执行UI操作,并在操作完成后拉起元服务:

typescript

@Entry
@Component
struct IntegratedExample {@State private dialogVisible: boolean = false;private uiContext: UIContext = this.getUIContext();private controller: LaunchController = new LaunchController();private targetAppId: string = '5765880207853275505';// 显示对话框并设置超时后拉起元服务showDialogAndLaunch() {// 使用UIContext显示对话框this.uiContext.showAlertDialog({title: '确认拉起',message: '是否要全屏拉起元服务?',autoCancel: true,confirm: {value: '确认',action: () => {// 用户确认后直接拉起this.launchAtomicService();}},cancel: () => {console.info('用户取消拉起操作');}});// 设置超时,10秒后自动拉起setTimeout(() => {this.launchAtomicService();}, 10000);}// 拉起元服务launchAtomicService() {try {this.controller.launchAtomicService(this.targetAppId, {});console.info('元服务拉起成功');} catch (error) {console.error(`元服务拉起失败: ${error.code}, ${error.message}`);// 失败后使用UIContext显示错误信息this.uiContext.showAlertDialog({title: '拉起失败',message: '元服务拉起失败,请重试或检查配置',confirm: {value: '确定',action: () => {}}});}}@BuilderMainContent() {Column() {Text('UIContext与元服务拉起演示').fontSize(20).margin({ bottom: 30 });Button('点击显示对话框并拉起元服务').onClick(() => {this.showDialogAndLaunch();}).width('80%').height(40);}.width('100%').height('100%').justifyContent(FlexAlign.Center);}build() {Column() {InnerFullScreenLaunchComponent({content: this.MainContent,controller: this.controller,});}.width('100%').height('100%');}
}

六、开发注意事项与最佳实践

  1. 上下文明确性:确保在UI上下文明确的地方使用UIContext方法,避免在UIAbility或异步回调中直接调用UI方法。

  2. 错误处理:在使用全屏拉起元服务时,始终添加错误处理逻辑,应对权限不足、元服务不存在等情况。

  3. 用户体验:在使用全屏嵌入式拉起时,提供清晰的用户界面和操作指引,让用户了解当前状态。

  4. 权限申请:确保在应用中申请必要的权限,并在尝试拉起前检查权限状态。

  5. 兼容性检查:在使用较新的API(如InnerFullScreenLaunchComponent)时,检查系统版本兼容性,必要时提供降级方案。

结语

UIContext是HarmonyOS NEXT中非常重要的API,它解决了UI上下文不明确导致的操作失败问题,为开发者提供了更灵活的UI控制能力。结合全屏拉起元服务的技术,可以创造出更加丰富和沉浸式的用户体验。希望通过本文的介绍,能够帮助大家更好地理解和应用这些技术,开发出更高质量的鸿蒙应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98495.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98495.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/98495.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leaflet读取mvt格式

如图所示&#xff0c;是全国的数据&#xff0c;截图是部分数据先安装&#xff1a;npm install leaflet npm install leaflet.vectorgrid如果是其余的框架直接用就行&#xff1a;import * as L from leaflet; import leaflet.vectorgrid;我用的是angular,所以是ts中声明&#xf…

OSG中交互(鼠标、键盘)处理

OpenSceneGraph (OSG) 中的交互处理,包括鼠标和键盘事件。 一、OSG 事件处理体系 OSG 使用一个基于访问者模式的事件处理体系,核心类包括: osgGA::GUIEventHandler: 所有事件处理器的基类 osgViewer::Viewer: 查看器,管理事件队列和分发 osgGA::EventQueue: 事件队列…

微硕双N-MOS管WST3392在汽车智能氛围灯系统中的应用

汽车智能氛围灯系统是现代车辆提升驾乘体验的重要配置&#xff0c;其多通道LED的精密调光与控制需选用高性能、小体积的功率开关器件。微硕WINSOK的WST3392是一款双N沟道MOS管&#xff0c;具有30V耐压、3.7A连续电流和46mΩ的低导通电阻&#xff0c;特别适用于氛围灯系统中的多…

深入 Kubernetes:从零到生产的工程实践与原理洞察

&#x1f31f; Hello&#xff0c;我是蒋星熠Jaxonic&#xff01; &#x1f308; 在浩瀚无垠的技术宇宙中&#xff0c;我是一名执着的星际旅人&#xff0c;用代码绘制探索的轨迹。 &#x1f680; 每一个算法都是我点燃的推进器&#xff0c;每一行代码都是我航行的星图。 &#x…

为何三折叠手机只有华为可以?看华为Mate XTs非凡大师就知道

9月4日&#xff0c;华为在深圳举行华为Mate XTs非凡大师及全场景新品发布会&#xff0c;不同于过往手机发布会对芯片配置只字不提&#xff0c;此次发布会公开展示了华为Mate XTs非凡大师内部芯片配置——麒麟9020芯片&#xff0c;时隔四年&#xff0c;终于在发布会上看到芯片公…

TensorFlow 2.x 核心 API 与模型构建

TensorFlow 2.x 核心 API 与模型构建TensorFlow 是一个强大的开源机器学习库&#xff0c;尤其在深度学习领域应用广泛。TensorFlow 2.x 在易用性和效率方面做了大量改进&#xff0c;引入了Keras作为其高级API&#xff0c;使得模型构建和训练更加直观和便捷。本文将介绍 TensorF…

TENGJUN防水TYPE-C连接器:工业级防护,认证级可靠,赋能严苛场景连接

在工业控制、户外电子、水下设备等对连接稳定性与防护性要求极致的场景中&#xff0c;TENGJUN防水TYPE-C连接器以“硬核性能全面认证”的双重优势&#xff0c;成为关键连接环节的信赖之选。从结构设计到认证标准&#xff0c;每一处细节都为应对复杂环境而生&#xff0c;重新定义…

【小呆的随机振动力学笔记】概率论基础

文章目录0. 概率论基础0.1 概率的初步认知0.2 随机变量的分布0.3 随机变量的数字特征0.3.1 随机变量的期望算子0.3.2 随机变量的矩0.4 随机变量的特征函数0.5 高数基础附录A 典型分布0. 概率论基础 \quad\quad在生活中或自然中&#xff0c;处处都存在随机现象&#xff0c;比如每…

使用海康机器人相机SDK实现基本参数配置(C语言示例)

在机器视觉项目开发中&#xff0c;相机的初始化、参数读取与设置是最基础也是最关键的环节。本文基于海康机器人&#xff08;Hikrobot&#xff09;提供的MVS SDK&#xff0c;使用C语言实现了一个简洁的控制程序&#xff0c;完成设备枚举、连接以及常用参数的获取与设置。 &…

【IoTDB】时序数据库选型指南:为何IoTDB成为工业大数据场景的首选?

【作者主页】Francek Chen 【专栏介绍】⌈⌈⌈大数据与数据库应用⌋⌋⌋ 大数据是规模庞大、类型多样且增长迅速的数据集合&#xff0c;需特殊技术处理分析以挖掘价值。数据库作为数据管理的关键工具&#xff0c;具备高效存储、精准查询与安全维护能力。二者紧密结合&#xff0…

用计算思维“破解”复杂Excel考勤表的自动化之旅

在我们日常工作中&#xff0c;经常会遇到一些看似简单却极其繁琐的任务。手动处理一份结构复杂的Excel考勤表&#xff0c;就是典型的例子。它充满了合并单元格、不规则的布局和隐藏的格式陷阱。面对这样的挑战&#xff0c;我们是选择“卷起袖子&#xff0c;日复一日地手动复制粘…

PAT 1006 Sign In and Sign Out

1006 Sign In and Sign Out分数 25作者 CHEN, Yue单位 浙江大学At the beginning of every day, the first person who signs in the computer room will unlock the door, and the last one who signs out will lock the door. Given the records of signing ins and outs, yo…

【git】首次clone的使用采用-b指定了分支,还使用了--depth=1 后续在这个基础上拉取所有的分支代码方法

要解决当前问题&#xff08;从浅克隆转换为完整克隆并获取所有分支&#xff09;&#xff0c;请按照以下步骤操作&#xff1a; 步骤 1&#xff1a;检查当前远程地址 首先确认远程仓库地址是否正确&#xff1a; git remote -v步骤 2&#xff1a;修改远程配置以获取所有分支 默认浅…

萝卜切丁机 机构笔记

萝卜切丁机_STEP_模型图纸免费下载 – 懒石网 机械工程师设计手册 1是传送带 2是曲柄滑块机构&#xff1f; 挤压动作

多张图片生成视频模型技术深度解析

多张图片生成视频模型测试相比纯文本输入&#xff0c;有视觉参考约束的生成通常质量更稳定&#xff0c;细节更丰富 1. 技术原理和工作机制 多张图片生成视频模型是一种先进的AI技术&#xff0c;能够接收多张输入图像&#xff0c;理解场景变化关系&#xff0c;并合成具有时间连…

中电金信:AI重构测试体系·智能化时代的软件工程新范式

AI技术的迅猛发展正加速推动软件工程3.0时代的到来&#xff0c;深刻地重塑了测试行业的运作逻辑&#xff0c;推动测试角色从“后置保障”转变为“核心驱动力”。在大模型技术的助力下&#xff0c;测试质量和效能将显著提升。9月5日至6日&#xff0c;Gtest2025全球软件测试技术峰…

100、23种设计模式之适配器模式(9/23)

适配器模式&#xff08;Adapter Pattern&#xff09; 是一种结构型设计模式&#xff0c;它允许将不兼容的接口转换为客户端期望的接口&#xff0c;使原本由于接口不兼容而不能一起工作的类可以协同工作。 一、核心思想 将一个类的接口转换成客户期望的另一个接口使原本因接口不…

线上环境CPU使用率飙升,如何排查

线上环境CPU使用率飙升&#xff0c;如何排查 1.CPU飙升的常见原因 1. 代码层面问题 死循环&#xff1a;错误的循环条件导致无限循环递归过深&#xff1a;没有正确的终止条件算法效率低&#xff1a;O(n)或更高时间复杂度的算法处理大数据集频繁GC&#xff1a;内存泄漏导致频繁垃…

《sklearn机器学习——特征提取》

在 sklearn.feature_extraction 模块中&#xff0c;DictVectorizer 是从字典&#xff08;dict&#xff09;中加载和提取特征的核心工具。它主要用于将包含特征名称和值的 Python 字典列表转换为机器学习算法所需的数值型数组或稀疏矩阵。 这种方法在处理结构化数据&#xff08;…

IEEE出版,限时早鸟优惠!|2025年智能制造、机器人与自动化国际学术会议 (IMRA 2025)

2025年智能制造、机器人与自动化国际学术会议 (IMRA2025)2025 International Conference on Intelligent Manufacturing, Robotics, and Automation中国▪湛江2025年11月14日-2025年11月16日IMRA2025权威出版大咖云集稳定检索智能制造、人工智能、机器人、物联网&#xff08;Io…