前言之前在封装图片滑动验证还有当下的一个自适应背景颜色功能时都需要获取到image.PixelMap对象于是就使用了getMediaContent方法代码如下const resourceMgr: resourceManager.ResourceManager this.getUIContext().getHostContext()!!.resourceManager; const fileData: Uint8Array await resourceMgr.getMediaContent($r(app.media.banner_001).id) const buffer fileData.buffer as ArrayBuffer; const imageSource: image.ImageSource image.createImageSource(buffer); const pixelMap: image.PixelMap await imageSource.createPixelMap();然而以上的代码却报了如下错误Failed to get media data in getMediaFunc后续经过排查发现了问题原因因为我是在单独的共享包中调用的造成了跨模块访问资源时 Context 不正确所以导致了资源获取失败。解决以上的问题也很简单通过createModuleContext创建目标模块的Context然后再获取资源管理器即可代码如下const ctx this.getUIContext().getHostContext()!! const context await application.createModuleContext(ctx, 模块名字)当然了还有一种解决方式直接使用getMediaByName方法传入资源的名字也可以。const resourceMgr: resourceManager.ResourceManager this.getUIContext().getHostContext()!!.resourceManager; const fileData: Uint8Array await resourceMgr.getMediaByName(banner_001) const buffer fileData.buffer as ArrayBuffer; const imageSource: image.ImageSource image.createImageSource(buffer); const pixelMap: image.PixelMap await imageSource.createPixelMap();我们可以发现很多场景下都会用到Context比如showToast比如获取缓存路径等等那么什么是ContextContext在实际的开发中又是扮演着怎样的角色呢下面我们就来一起了解一下。什么是Context官方解读为Context是应用中对象的上下文其提供了应用的一些基础信息例如resourceManager资源管理、applicationInfo当前应用信息、area文件分区等。我们在实际的开发中可能遇到过不同的Context比如最常见的是UIContext然后就是ApplicationContext除此之外还有很多的Context比如基类Context、ApplicationContext、AbilityStageContext、UIAbilityContext、ExtensionContext等Context不同类型Context的获取方式与使用场景也是不同的。不同类型Context的继承关系如下不同类型Context的获取方式和使用场景如下Context类型说明获取方式使用场景ApplicationContext应用的全局上下文提供应用级别的信息和能力。- 从API version 14开始可以直接使用getApplicationContext获取。- API version 14以前版本只能使用其他Context实例的getApplicationContext方法获取。- 获取当前应用的基本信息。- 获取应用级别的文件路径。- 获取和修改加密分区。- 监听应用前后台变化。AbilityStageContext模块级别的上下文提供模块级别的信息和能力。- 如果需要获取当前AbilityStage的Context可以直接通过AbilityStage实例获取context属性。- 如果需要获取同一应用中其他Module的Context可以通过createModuleContext方法。- 获取当前模块的基本信息。- 获取模块级别的文件路径。UIAbilityContextUIAbility组件对应的上下文提供UIAbility对外的信息和能力。- 通过UIAbility实例直接获取context属性。- 在UIAbility的窗口中加载的UI组件实例需要使用ohos.arkui.UIContext提供的getHostContext方法。- 获取当前UIAbility的基本信息。- 启动其他应用或元服务、连接/断连系统应用创建的ServiceExtensionAbility等。- 销毁自身的UIAbility。ExtensionContextExtensionAbility组件对应的上下文每种类型的ExtensionContext提供不同的信息和能力。通过ExtensionAbility实例直接获取Context属性。不同类型的ExtensionAbility对应的Context提供的能力不同。以输入法上下文InputMethodExtensionContext为例主要提供如下能力- 获取InputMethodExtensionAbility的基本信息。- 销毁当前输入法。UIContextArkUI的UI实例上下文提供UI操作相关的能力。与上述其他类型的Context无直接关系。- 在UI组件内获取UIContext直接使用组件内置的getUIContext方法。- 在存在Window实例的情况下使用ohos.window提供的getUIContext方法。主要用于UI实例中UI相关操作例如- 获取当前UI实例的字体。- 显示不同类型的弹框。- 设置软键盘弹出时UI避让模式。一、ApplicationContextApplicationContext 是应用级别的全局上下文继承自 Context提供了应用生命周期监听、进程管理、应用环境设置等应用级别的管控能力。有一个需要注意的点是一个应用只有一个 ApplicationContext 实例可以在 UIAbility、ExtensionAbility、AbilityStage 中获取。获取方式从 API version 14 开始可以直接通过application.getApplicationContext()获取无需依赖 Context 基类API version 14 以前只能使用其他 Context 实例的getApplicationContext()方法获取。// 方式一API 14 直接获取推荐 import { application, common } from kit.AbilityKit; let appContext: common.ApplicationContext application.getApplicationContext(); // 方式二通过其他 Context 实例获取API 9 通用 // 在 UIAbility 中 import { UIAbility, common } from kit.AbilityKit; export default class EntryAbility extends UIAbility { onCreate(want: Want): void { let appContext: common.ApplicationContext this.context.getApplicationContext(); } }核心方法与能力方法/能力说明on(abilityLifecycle)注册应用内组件生命周期变化监听on(environment)注册系统环境变化监听语言、颜色模式等on(systemMemoryLevel)注册系统内存变化监听off(...)取消对应的事件监听getApplicationInfo()获取应用信息继承自 ContextgetCacheDir()/ getFilesDir()获取应用级文件路径继承自 Contextarea获取/设置加密分区模式setColorMode()设置应用颜色模式setLanguage()设置应用语言典型使用场景获取当前应用的基本信息name、应用版本等获取应用级别的文件路径如缓存目录、文件目录获取和修改加密分区监听应用前后台变化、系统内存变化、环境变化设置应用语言和颜色模式import { application, common, AbilityConstant } from kit.AbilityKit; import { hilog } from kit.PerformanceAnalysisKit; const DOMAIN: number 0x0000; const TAG: string AppContextDemo; // 获取应用上下文并监听生命周期 let appContext: common.ApplicationContext application.getApplicationContext(); let abilityLifecycleCallback: AbilityLifecycleCallback { onAbilityCreate(ability): void { hilog.info(DOMAIN, TAG, Ability创建: ${ability.context.abilityInfo.name}); }, onAbilityForeground(ability): void { hilog.info(DOMAIN, TAG, Ability切到前台: ${ability.context.abilityInfo.name}); }, onAbilityBackground(ability): void { hilog.info(DOMAIN, TAG, Ability切到后台: ${ability.context.abilityInfo.name}); }, onAbilityDestroy(ability): void { hilog.info(DOMAIN, TAG, Ability销毁: ${ability.context.abilityInfo.name}); }, onWindowStageCreate(ability, windowStage) { console.info(AbilityLifecycleCallback onWindowStageCreate ability: ${ability}); console.info(AbilityLifecycleCallback onWindowStageCreate windowStage: ${windowStage}); }, onWindowStageActive(ability, windowStage) { console.info(AbilityLifecycleCallback onWindowStageActive ability: ${ability}); console.info(AbilityLifecycleCallback onWindowStageActive windowStage: ${windowStage}); }, onWindowStageInactive(ability, windowStage) { console.info(AbilityLifecycleCallback onWindowStageInactive ability: ${ability}); console.info(AbilityLifecycleCallback onWindowStageInactive windowStage: ${windowStage}); }, onWindowStageDestroy(ability, windowStage) { console.info(AbilityLifecycleCallback onWindowStageDestroy ability: ${ability}); console.info(AbilityLifecycleCallback onWindowStageDestroy windowStage: ${windowStage}); }, onAbilityContinue(ability) { console.info(AbilityLifecycleCallback onAbilityContinue ability: ${ability}); } } appContext.on(abilityLifecycle,abilityLifecycleCallback) // 获取应用级缓存目录 let cacheDir: string appContext.cacheDir; hilog.info(DOMAIN, TAG, 缓存目录: ${cacheDir});二、AbilityStageContext模块上下文AbilityStageContext 是 AbilityStage 的上下文环境继承自 Context提供访问特定于 AbilityStage 的资源的能力包括获取 AbilityStage 对应的 ModuleInfo 对象、环境变化对象。AbilityStage 是 Module 级别的组件管理器与 Module 一一对应应用的 HAP/HSP 在首次加载时会创建一个 AbilityStage 实例。获取方式通过 AbilityStage 实例的context属性直接获取如果需要获取同一应用中其他 Module 的 Context可以通过createModuleContext方法创建。import { AbilityStage } from kit.AbilityKit; export default class MyAbilityStage extends AbilityStage { onCreate(): void { // 获取当前模块的 AbilityStageContext let stageContext: common.AbilityStageContext this.context; // 获取当前模块信息 let moduleInfo: common.ModuleInfo stageContext.currentHapModuleInfo; console.info(模块名: ${moduleInfo.moduleName}); } }核心属性与方法属性/方法说明currentHapModuleInfo获取当前 AbilityStage 对应的 ModuleInfo 对象getCacheDir()/ getFilesDir()获取模块级文件路径继承自 Context典型使用场景获取当前模块的基本信息moduleName、moduleInfo 等获取模块级别的文件路径在应用启动框架AppStartup中作为启动任务的入参传递三、UIAbilityContextUIAbility 组件上下文UIAbilityContext 是 UIAbility 组件的上下文继承自 Context。每个 UIAbility 组件实例化时系统都会自动创建对应的 UIAbilityContext。开发者可以通过它获取组件信息 AbilityInfo、应用信息 ApplicationInfo、拉起其他 UIAbility、连接系统服务、销毁 UIAbility 等。获取方式在 UIAbility 中直接通过this.context获取在页面/组件中需要先获取 UIContext再通过getHostContext()获取关联的 UIAbilityContext。// 方式一在 UIAbility 中直接获取 import { UIAbility, Want } from kit.AbilityKit; export default class EntryAbility extends UIAbility { onCreate(want: Want): void { let uiAbilityContext: common.UIAbilityContext this.context; console.info(Ability名称: ${uiAbilityContext.abilityInfo.name}); } } // 方式二在页面组件中获取推荐方式 Entry Component struct Index { build() { Column() { Button(获取上下文) .onClick(() { // 通过 getUIContext 获取 UIContext再通过 getHostContext 获取 UIAbilityContext let uiAbilityContext: common.UIAbilityContext this.getUIContext().getHostContext() as common.UIAbilityContext; console.info(Ability名称: ${uiAbilityContext.abilityInfo.name}); }) } } }核心方法与能力方法说明startAbility(want)启动其他 UIAbility支持 callback 和 Promise 两种方式startAbilityForResult(want)启动 UIAbility 并获取返回结果terminateSelf()销毁当前 UIAbilityterminateSelfWithResult()销毁当前 UIAbility 并返回结果connectServiceExtensionAbility(want)连接 ServiceExtensionAbilitydisconnectServiceExtensionAbility(connection)断开 ServiceExtensionAbility 连接abilityInfo获取当前 UIAbility 的配置信息currentHapModuleInfo获取当前 HAP 模块信息config获取配置信息典型使用场景获取当前 UIAbility 的基本信息启动其他应用或元服务连接/断连系统应用创建的 ServiceExtensionAbility销毁自身的 UIAbility页面间传参与结果回传import { UIAbility, Want, common } from kit.AbilityKit; import { hilog } from kit.PerformanceAnalysisKit; import { BusinessError } from kit.BasicServicesKit; const DOMAIN: number 0x0000; const TAG: string UIAbilityContextDemo; export default class EntryAbility extends UIAbility { onCreate(want: Want): void { let context: common.UIAbilityContext this.context; // 启动另一个 UIAbility let wantInfo: Want { bundleName: com.example.demo, abilityName: OtherAbility }; context.startAbility(wantInfo) .then(() { hilog.info(DOMAIN, TAG, 启动成功); }) .catch((err: BusinessError) { hilog.error(DOMAIN, TAG, 启动失败: ${err.message}); }); } onBackPress(): boolean { // 销毁当前 UIAbility this.context.terminateSelf(); return true; } }四、ExtensionContext扩展能力上下文ExtensionContext 是 ExtensionAbility 组件对应的上下文继承自 Context。每种类型的 ExtensionAbility 都有对应的 ExtensionContext 子类提供不同的信息和能力。ExtensionContext 本身是基类实际使用时通常操作其子类。常见子类子类对应 ExtensionAbility核心能力FormExtensionContextFormExtensionAbility查询该扩展的FormExtensionAbility所属HAP包等信息。InputMethodExtensionContextInputMethodExtensionAbility获取输入法信息、销毁当前输入法AccessibilityExtensionContextAccessibilityExtensionAbility配置辅助功能、查询节点信息、手势注入PushExtensionContextPushExtensionAbility访问推送扩展资源AgentExtensionContextAgentExtensionAbility访问智能体配置的 AgentCard 信息AppServiceExtensionContextAppServiceExtensionAbility连接/断开系统应用后台服务获取方式通过 ExtensionAbility 实例直接获取context属性。import { FormExtensionAbility, formBindingData } from kit.FormKit; import { Want } from kit.AbilityKit; export default class MyFormExtensionAbility extends FormExtensionAbility { onAddForm(want: Want) { console.info(FormExtensionAbility onAddForm, want: ${want.abilityName}); let extensionContext this.context; let hapInfo extensionContext.currentHapModuleInfo; console.info(HAP name is: ${hapInfo.name}); let dataObj1: Recordstring, string { temperature: 11c, time: 11:00 }; let obj1: formBindingData.FormBindingData formBindingData.createFormBindingData(dataObj1); return obj1; } };典型使用场景不同类型的 ExtensionAbility 对应不同的后台服务场景获取当前 ExtensionAbility 的基本信息启动/停止/绑定/解绑其他 Ability销毁当前 ExtensionAbility五、UIContextUI 实例上下文UIContext 是 UI 实例运行环境的抽象概念用于关联窗口与 UI 页面管理组件、布局、动画以及交互事件等 UI 功能。UIContext 与上述四种 Context 无继承关系它由窗口对象创建并管理每个窗口对应一个 UIContext 实例。从 API version 10 开始许多全局接口如ohos.promptAction、ohos.router、AlertDialog等因多 UI 实例场景下上下文不明确而被废弃需要通过 UIContext 提供的对应方法获取实例后调用。获取方式UIContext 有三种获取方式// 方式一在自定义组件中通过内置方法获取最常用 Entry Component struct Index { build() { Column() { Button(获取UIContext) .onClick(() { let uiContext: UIContext this.getUIContext(); }) } } } // 方式二在 UIAbility 中通过窗口获取 import { UIAbility, window } from kit.AbilityKit; export default class EntryAbility extends UIAbility { onWindowStageCreate(windowStage: window.WindowStage): void { let uiContext: UIContext windowStage.getMainWindowSync().getUIContext(); } } // 方式三通过 UIContext 静态方法获取 import { UIContext } from kit.ArkUI; let uiContext: UIContext | undefined UIContext.getCallingScopeUIContext();核心方法与能力UIContext 提供了大量 UI 相关的接口用于替代被废弃的全局接口方法说明替代的全局接口getPromptAction()获取 PromptAction 对象用于弹窗、Toast 等ohos.promptActiongetRouter()获取 Router 对象用于页面路由ohos.routershowAlertDialog()显示警告弹窗AlertDialog.show()showActionSheet()显示列表选择弹窗ActionSheet.show()getComponentUtils()获取 ComponentUtils 对象用于组件坐标和尺寸信息ohos.arkui.componentUtilsgetMediaQuery()获取 MediaQuery 对象用于媒体查询ohos.mediaquerygetHostContext()获取关联的 UIAbilityContext 或 ExtensionContextgetContext()getSharedLocalStorage()获取共享的 LocalStorage-runScopedTask()在指定 UI 上下文中执行任务-典型使用场景替代全局接口进行弹窗操作AlertDialog、ActionSheet、PromptAction页面路由跳转获取组件坐标和尺寸信息在页面/组件中获取关联的 UIAbilityContext多 UI 实例场景下确保 UI 操作在正确的上下文中执行import { UIContext, PromptAction, router } from kit.ArkUI; import { common } from kit.AbilityKit; import { BusinessError } from kit.BasicServicesKit; Entry Component struct Index { build() { Column() { // 弹窗示例 Button(显示Toast) .onClick(() { let uiContext: UIContext this.getUIContext(); let promptAction: PromptAction uiContext.getPromptAction(); promptAction.showToast({ message: 这是一条Toast消息, duration: 2000 }); }) // 页面路由示例 Button(跳转页面) .onClick(() { let uiContext: UIContext this.getUIContext(); let routerInstance: router.Router uiContext.getRouter(); routerInstance.pushUrl({ url: pages/SecondPage }); }) // 警告弹窗示例 Button(显示警告弹窗) .onClick(() { let uiContext: UIContext this.getUIContext(); uiContext.showAlertDialog({ title: 提示, message: 确定要执行此操作吗, onConfirm: () { console.info(用户点击了确认); } }); }) // 获取 UIAbilityContext Button(获取AbilityContext) .onClick(() { let uiContext: UIContext this.getUIContext(); let abilityContext: common.UIAbilityContext uiContext.getHostContext() as common.UIAbilityContext; console.info(包名: ${abilityContext.abilityInfo.bundleName}); }) } .width(100%) .height(100%) } }AppStorage获取Context在HarmonyOS应用开发中工具类非UI组件、非UIAbility的普通class无法直接获取Context对象。标准做法是在UIAbility的生命周期回调中获取Context后通过AppStorage.setOrCreate将其保存为全局状态数据随后在工具类中通过AppStorage.get取出使用。AppStorage是应用启动时创建的单例提供应用级别的中心存储支持主线程内多个UIAbility实例间的数据共享。示例代码以下示例分为两个步骤第一步在EntryAbility中存储Context第二步在工具类中获取Context。步骤一在EntryAbility的onCreate回调中存储Contextimport { UIAbility, AbilityConstant, Want } from kit.AbilityKit; export default class EntryAbility extends UIAbility { onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void { // 将当前UIAbility的上下文存入AppStoragekey为appContext AppStorage.setOrCreate(appContext, this.context); } onWindowStageCreate(windowStage: window.WindowStage): void { windowStage.loadContent(pages/Index); } }步骤二在工具类中通过AppStorage获取Contextimport { common } from kit.AbilityKit; class PreferenceUtil { // 从AppStorage中获取UIAbilityContext static getContext(): common.UIAbilityContext { const context AppStorage.getcommon.UIAbilityContext(appContext); if (!context) { throw new Error(Context未初始化请确认AppStorage中已存储appContext); } return context; } // 示例使用Context获取文件路径 static getFilesDir(): string { const context this.getContext(); return context.filesDir; } }补充说明存储时机Context应在onCreate回调中存储此时this.context已经可用。避免在onWindowStageCreate之前的其他阶段获取以免Context尚未初始化。类型安全AppStorage.get返回值为泛型类型使用时应明确指定泛型参数如common.UIAbilityContext并通过空值检查确保Context已正确存储避免运行时异常。Context类型选择根据实际需求选择存储的Context类型。UIAbilityContext提供组件级能力如获取filesDir、resourceManager等若仅需应用级能力如监听应用前后台变化可存储ApplicationContext通过this.context.getApplicationContext()获取。非UI场景的通用方案此方法不仅适用于工具类也适用于其他非ArkUI页面如Worker线程外的纯逻辑模块中需要访问Context的场景。Worker线程中不支持直接使用此方式需通过消息传递将Context发送至Worker线程。相关总结在UI页面中我们可以很轻松的获取到Context但是在工具类中如何获取呢首先可以明确的是工具类中是无法直接获取Context的我们可以在获取应用上下文Context后保存至AppStorage然后通过AppStorage来获取当然了也可以通过别的方式比如全局静态变量比如一个单例工具类等等都是可以的。
企业数字化 ERP 产品动态
相关推荐
用 C++ 写 Web 服务实战(二):路由进阶、中间件链与文件上传 用 C 写 Web 服务实战(二):路由进阶、中间件链与文件上传
上一篇我们搭起了一个能跑的 Web 应用骨架——监听端口、注册 JSON 路由、绑定静态目录、开启多事件循环、写了一个文件日志中间件。这篇在这个骨架之上继续往上盖:路由参… · 2026/9/24 10:49:45
nvm 速查表:Node.js 多版本安装、切换与镜像配置实战指南 文档知识库教程开发工具 【免费下载链接】reference 为开发人员分享快速参考备忘清单(速查表) 项目地址: https://gitcode.com/jaywcjlove/reference 点击查看 免费下载 本文基于开源仓库 reference 的 nvm 备忘清单 整理而成,聚焦 Node Version Manage… · 2026/9/24 10:49:45
Work Agent深度解读:AI如何完成长程复杂任务 AI交互形态正在经历一轮底层转变,从单次问答的对话窗口,逐步进化为可以自主推进多步骤工作的智能执行主体。早期大模型产品的核心交互形态是单轮问答,用户提出问题,模型即时返回一段文本结果;随着工具调用能力成熟&… · 2026/9/24 10:49:39
Cadence Allegro 16.6网表导入ERROR(24)报错排查与解决方法 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 11:19:01
紫三角CAD翻译 市政工程图纸专业译制方案 引言市政工程出海项目中,图纸翻译已成为跨境协作的核心效率瓶颈。传统人工译制周期长、成本高,PDF图像级翻译无法编辑,专业术语错译率高,多专业图纸切换工具的混乱进一步加剧协作内耗。本文从行业痛点诊断、紫三角CAD译制方案的技… · 2026/9/24 11:18:42
SG3525推挽谐振软开关设计实战:高效率中功率电源的工程落地路径 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 11:18:35
RFID标签“假写入“故障排查:90%项目都踩过的5个隐蔽坑 某汽车零部件厂的产线 RFID 项目,上线第二天开始批量漏读。
操作员把 RFID 标签从打印机里拿出来的瞬间,设备日志显示"写入成功"。肉眼检查没有任何异常。但标签贴到金属工装上、走过读写工位时,三成左右的数据读不出来——读不到的… · 2026/9/24 11:18:29
FX5U与汇川伺服Modbus-RTU通讯实战指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 11:18:29
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44