此文章内容兼容API12,使用harmony next应用开发

简介

context,即上下文,

  • 访问应用资源,如文件、字符串、图片、布局等。
  • 启动 Ability、Service、Data 等组件。
  • 获取系统服务,如 Preferences、SensorManager 等。
  • 订阅生命周期等

1,各种context
继承关系:
context
持有关系:
context

2,获取方式不同

  • UIAbilityContext 在 UIAbility 的 onCreate 时即可获取;提供UIAbility的相关配置信息以及操作UIAbility和ServiceExtensionAbility的方法,如启动UIAbility,停止当前UIAbilityContext所属的UIAbility,启动、停止、连接、断开连接ServiceExtensionAbility等
export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    let uiAbilityContext = this.context;
  }
}
  • 取特定场景ExtensionContext,如 ServiceExtensionContext,同样在 onCreate 时获取
  • 获取module级别的AbilityStageContext,同样onCreate 获取,比基类context多了HapModuleInfo、Configuration等信息
  • 获取应用级别的ApplicationContext ,同样onCreate 获取,比基类context多了订阅应用内应用组件的生命周期的变化、订阅系统内存变化、订阅应用内系统环境变化、设置应用语言、设置应用颜色模式、权限等能立

2, 不同context有不同的属性和方法,并不完全一致

解答

1,子线程Worker中如何获取 context
aw : 将主线程的context 以postMessage参数的方式传输到work线程中
2,hsp 通过 getContext(this) 获取资源会报错; 因为其仅包含静态资源,本身没有上下文概念
aw: 先通过getContext()获取当前上下文,再通过createModuleContext()获取HSP模块的上下文,再获取HSP模块的resourceManager,然后再调用resourceManager的接口获取资源。

          getContext()
            .createModuleContext('library')  //创建此包的上下文
            .resourceManager
            .getStringValue(ResManager.getDesc())
            .then(value => {
              console.log('getStringValue is ' + value);
              this.message = 'getStringValue is ' + value;
            })
            .catch((err: BusinessError) => {
              console.error('getStringValue promise error is ' + err);
            });

3,har 和 hsp 包如何获得context
aw: 使用 createModuleContext(context: Context, moduleName: string) 获得本包的上下文
4,getContext(component?: Object):Context, 参数传与不传的区别
aw:入参是组件,传入组件则返回此组件的上下文; 若不传,则返回当前组件的上下文
上下文对象Context包含了组件的状态、属性、方法等信息
5,页面/组件中,如何获得当前Ability的Context,即 UIAbilityContext
aw: 可调用getContext接口获取当前页面关联的UIAbilityContext
6,工具类等非组件page中,如何获取context
aw: 无法获取,可使用 APPStorage 进行存取

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐