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