HarmonyOS NEXT鸿蒙开发:新版API Context废弃,通过 UIContext 获取

说明

官网说明

API 18 中废弃 getContext() 获取 Context 上下文的方式,虽然可以用,但后续版本中可能彻底废弃

推荐通过 UIContext 获取 Context

在 EntryAbility 中获取上下文

详见官网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 长时间使用,避免内存泄漏。
  • 上下文对象应根据实际需要选择合适的获取时机。
  • 推荐将上下文作为参数传递给需要使用的模块,而不是全局静态变量。

原文出处:/show_1GW2R14WjKlX.html