HarmonyOS NEXT鸿蒙开发:新版API Context废弃,通过 UIContext 获取 作者:马育民 • 2025-12-19 12:53 • 阅读:10000 # 说明 [官网说明](https://developer.huawei.com/consumer/cn/blog/topic/03188648694547230 "官网说明") API 18 中废弃 `getContext()` 获取 `Context` 上下文的方式,虽然可以用,但后续版本中可能彻底废弃 推荐通过 `UIContext` 获取 `Context` # 在 EntryAbility 中获取上下文 详见[官网API](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-window-windowstage#getmainwindowsync9 "官网API") 调用该接口前,建议先通过 `loadContent()` 方法或者 `setUIContent()` 方法完成页面加载 所以,要写在 `EntryAbility` 的 `windowStage.loadContent()` 回调方法中 **提示:**写在 `loadContent()` 回调方法,是已经加载页面了,所以与写在 `首页` 中差不多 ``` try { const uiContext = windowStage.getMainWindowSync().getUIContext() requestPermissionFromUserAndShow(pg,reason,uiContext) }catch (err) { console.error(TAG,`getMainWindowSync() 报错!code:${err.code},message:${err.message}`) } ``` 说明: - windowStage.getMainWindowSync():获取主窗口实例。 - getUIContext():获取窗口的 UI 上下文。 - getHostContext():最终获取到系统上下文。 这种方式适用于在 Ability 生命周期中初始化某些依赖上下文的模块。 # 在 UI 组件中获取上下文 这种方式适用于在组件内部进行资源访问、启动服务、跳转页面等操作。 ``` const context = this.getUIContext().getHostContext(); ``` **解释:** - this.getUIContext():获取当前 UI 组件的 UI 上下文。 - getHostContext():从 UI 上下文中提取出系统上下文(即传统的 Context)。 # 在工具类中获取上下文 工具类通常不直接持有上下文,因此需要通过传参的方式将上下文注入进去。以下是两种常见做法: ### 方式 A:从 EntryAbility 传入 windowStage 在 EntryAbility 中将 windowStage 传入工具类初始化方法: ``` // 只能在EntryAbility 中的windowStage.loadContent中 import MyUtils from 'utils/MyUtils'; onWindowStageCreate(windowStage: window.WindowStage): void { windowStage.loadContent('pages/Index',()=>{ //传递给工具类 MyUtils.init(windowStage); }) } ``` 在工具类中保存上下文: ``` // utils/MyUtils.ts let context: Context; export default class MyUtils { static init(windowStage: window.WindowStage) { context = windowStage.getMainWindowSync().getUIContext().getHostContext(); } static doSomething() { // 使用 context 做一些操作 } } ``` ### 方式 B:从 UI 组件传入 UIContext 如果你在 UI 组件中调用工具类,也可以直接传入 UIContext: ``` // 在 UI 组件中 import MyUtils from 'utils/MyUtils'; MyUtils.init(this.getUIContext()); ``` 工具类中处理: ``` // utils/MyUtils.ts let context: Context; export default class MyUtils { static init(uiContext: UIContext) { context = uiContext.getHostContext(); } static doSomething() { // 使用 context 做一些操作 } } ``` # 注意事项 - 不要缓存 context 长时间使用,避免内存泄漏。 - 上下文对象应根据实际需要选择合适的获取时机。 - 推荐将上下文作为参数传递给需要使用的模块,而不是全局静态变量。 原文出处:http://www.malaoshi.top/show_1GW2R14WjKlX.html