背景

不管是Android还是HarmonyOS Next都设计到一个上下文Context的概念,很多场景,比如获取文件资源等都需要依赖这个Context。Context有各种类型的Context,不同Context的获取方式,作用都不同,为了顺利进行HarmonyOS开发,很有必要弄清楚各种Context。

Context概念

Context是应用中对象的上下文,其提供了应用的一些基础信息,例如resourceManager(资源管理)、applicationInfo(当前应用信息)、dir(应用文件路径)、area(文件分区)等,以及应用的一些基本方法,例如createBundleContext()、getApplicationContext()等。

UIAbility组件和各种ExtensionAbility派生类组件都有各自不同的Context类。分别有基类Context、ApplicationContext、AbilityStageContext、UIAbilityContext、ExtensionContext、ServiceExtensionContext等Context。

各种Context继承关系如下:
在这里插入图片描述

各种Context的持有关系如下:
在这里插入图片描述

这里面提到了9种Context:

  1. BaseContext
  2. Context
  3. ApplicationContext
  4. AbilityStageContext
  5. UIAbilityContext
  6. ExtensionContext
  7. 其他ExtensionContext
  8. FormExtensionContext
  9. ServiceExtensionContext

各种Context提供能力

下面看看各种Context提供了哪些能力。

BaseContext

BaseContext抽象类用于表示继承的子类Context是Stage模型还是FA模型,是所有Context类型的父类。主要提供了stageMode属性:

名称 类型 可读 可写 说明
stageMode boolean 表示是否Stage模型。

true:Stage模型

false:FA模型。
Context

Context模块继承自BaseContext,提供了ability或application的上下文的能力,包括访问特定应用程序的资源等。提供了如下属性:

名称 类型 只读 可选 说明
resourceManager resmgr.ResourceManager 资源管理对象。
applicationInfo ApplicationInfo 当前应用程序的信息。
cacheDir string 缓存目录。
tempDir string 临时目录。
resourceDir string 资源目录。
filesDir string 文件目录。
databaseDir string 数据库目录。
preferencesDir string preferences目录。
bundleCodeDir string 安装包目录。不能拼接路径访问资源文件,请使用资源管理接口访问资源。
distributedFilesDir string 分布式文件目录。
cloudFileDir12+ string 云文件目录。
eventHub [EventHub 事件中心,提供订阅、取消订阅、触发事件对象。
area contextConstant.AreaMode 文件分区信息。
可以看到,Context已经有了获取资源和资源路径的属性。

提供方法:

  • getApplicationContext(): ApplicationContext:获取本应用的应用上下文
  • getGroupDir(dataGroupID: string): Promise<string>:通过使用应用中的Group ID获取对应的共享目录,使用Promise异步回调。
  • getGroupDir(dataGroupID: string, callback: AsyncCallback<string>): void:通过使用应用中的Group ID获取对应的共享目录,使用callback异步回调。
ApplicationContext

ApplicationContext模块继承自Context,提供开发者应用级别的的上下文的能力,包括提供注册及取消注册应用内组件生命周期的监听接口。提供了下面方法:

  • on(type: 'abilityLifecycle', callback: AbilityLifecycleCallback): number:注册监听应用内生命周期。使用callback异步回调。仅支持主线程调用
  • off(type: 'abilityLifecycle', callbackId: number, callback: AsyncCallback<void>): void:取消监听应用内生命周期。使用callback异步回调。仅支持主线程调用。
  • on(type: 'environment', callback: EnvironmentCallback): number:注册对系统环境变化的监听。使用callback异步回调。仅支持主线程调用。
  • off(type: 'environment', callbackId: number, callback: AsyncCallback<void>): void:取消对系统环境变化的监听。使用callback异步回调。仅支持主线程调用。
  • on(type: 'applicationStateChange', callback: ApplicationStateChangeCallback): void:注册对当前应用前后台变化的监听。使用callback异步回调。仅支持主线程调用。
  • off(type: 'applicationStateChange', callback?: ApplicationStateChangeCallback): void:取消当前应用注册的前后台变化的全部监听。使用callback异步回调。仅支持主线程调用
  • getRunningProcessInformation(): Promise<Array<ProcessInformation>>:获取有关运行进程的信息。使用Promise异步回调。
  • getRunningProcessInformation(callback: AsyncCallback<Array<ProcessInformation>>): void:获取有关运行进程的信息。使用callback异步回调。
  • killAllProcesses(): Promise<void>:终止应用的所有进程,进程退出时不会正常走完应用生命周期。使用Promise异步回调。仅支持主线程调用。
  • setColorMode(colorMode: ConfigurationConstant.ColorMode): void:设置应用的颜色模式。仅支持主线程调用。
  • setLanguage(language: string): void:设置应用的语言。仅支持主线程调用
  • clearUpApplicationData(): Promise<void>:清理应用本身的数据,同时撤销应用向用户申请的权限。使用Promise异步回调。仅支持主线程调用。
  • clearUpApplicationData(callback: AsyncCallback<void>): void:清理应用本身的数据,同时撤销应用向用户申请的权限。使用callback异步回调。仅支持主线程调用。
  • restartApp(want: Want): void:应用重启并拉起自身指定UIAbility。重启时不会收到onDestroy回调。仅支持主线程调用,且待重启的应用需要处于获焦状态。
  • getCurrentAppCloneIndex(): number:获取当前应用的分身索引。
  • setFont(font: string): void:设置应用的字体类型。仅支持主线程调用。
  • setSupportedProcessCache(isSupported : boolean): void:应用设置自身是否支持缓存后快速启动。仅支持主线程调用。
AbilityStageContext

AbilityStageContext是AbilityStage的上下文环境,继承自Context。

AbilityStageContext提供允许访问特定于abilityStage的资源的能力,包括获取AbilityStage对应的ModuleInfo对象、环境变化对象。提供了如下属性:

名称 类型 可读 可写 说明
currentHapModuleInfo HapModuleInfo AbilityStage对应的ModuleInfo对象。
config Configuration 环境变化对象。
UIAbilityContext

UIAbilityContext是需要保存状态的UIAbility所对应的context,继承自Context,提供UIAbility的相关配置信息以及操作UIAbility和ServiceExtensionAbility的方法,如启动UIAbility,停止当前UIAbilityContext所属的UIAbility,启动、停止、连接、断开连接ServiceExtensionAbility等。提供了以下属性:

名称 类型 可读 可写 说明
abilityInfo AbilityInfo UIAbility的相关信息。

元服务API: 从API version 11开始,该接口支持在元服务中使用。
currentHapModuleInfo HapModuleInfo 当前HAP的信息。

元服务API: 从API version 11开始,该接口支持在元服务中使用。
config Configuration 与UIAbility相关的配置信息,如语言、颜色模式等。

元服务API: 从API version 11开始,该接口支持在元服务中使用。
windowStage12+ window.WindowStage 当前WindowStage对象。仅支持在主线程调用。

元服务API: 从API version 12开始,该接口支持在元服务中使用。
提供能力:
  • 启动Ability:startAbility、startAbilityForResult
  • 停止Ability自身:terminateSelf、terminateSelfWithResult
  • 将当前Ability连接到一个ServiceExtensionAbility:connectServiceExtensionAbility
  • 断开与ServiceExtensionAbility的连接,断开连接之后需要将连接成功时返回的remote对象置空:disconnectServiceExtensionAbility
  • 跨设备场景下,启动指定Ability至前台或后台,同时获取其Caller通信接口,调用方可使用Caller与被启动的Ability进行通信:startAbilityByCall
  • 设置UIAbility在任务中显示的名称:setMissionLabel
  • 设置UIAbility任务中流转状态:setMissionContinueState
  • 恢复UIAbility中的WindowStage数据:restoreWindowStage
  • 查询UIAbility是否在terminating状态:isTerminating
  • 启动一个支持模态弹框的ServiceExtensionAbility。ServiceExtensionAbility被启动后,应用弹出模态弹框,通过调用setRequestResult接口返回结果给调用者:requestDialogService
  • 当页面加载完成(loadContent成功)时,为开发者提供打点功能(callback形式):reportDrawnCompleted
  • 通过type隐式启动UIExtensionAbility。使用callback异步回调:startAbilityByType
  • 显示当前Ability:showAbility
  • 隐藏当前Ability:hideAbility
  • 将处于前台的Ability移动到后台:moveAbilityToBackground
  • 跳出式启动EmbeddableUIAbility,并返回结果:openAtomicService
  • 通过AppLinking启动UIAbility:openLink
  • 当通过startAbilityForResult或openLink拉起目标方Ability,且需要目标方返回结果时,目标方可以通过该接口将结果返回并拉起调用方。与terminateSelfWithResult不同的是,本接口在返回时不会销毁当前Ability:backToCallerAbilityWithResult
ExtensionContext

ExtensionContext是Extension的上下文环境,继承自Context。

ExtensionContext模块提供访问特定Extension的资源的能力,对于拓展的Extension,可直接将ExtensionContext作为上下文环境,或者定义一个继承自ExtensionContext的类型作为上下文环境。

提供了以下属性:

名称 类型 可读 可写 说明
currentHapModuleInfo HapModuleInfo 所属Hap包的信息。

(详见SDK目录下的 api\bundle\hapModuleInfo.d.ts)
config Configuration 所属Module的配置信息。

(详见SDK目录下的 api@ohos.app.ability.Configuration.d.ts)
extensionAbilityInfo ExtensionAbilityInfo 所属Extension的信息。

(详见SDK目录下的 api\bundle\extensionAbilityInfo.d.ts)

Context常见使用场景

上面对各种Context分析可以了解到,Context主要可以使用在以下场景:

  • 获取应用文件路径
  • 获取和修改加密分区
  • 获取本应用中其他Module的Context
  • 订阅进程内UIAbility生命周期变化

以最典型的通过resourceManager获取字符串资源为例:

static getStringSync(context: common.Context | undefined, resource: Resource): string {  
  let rscManager = (context ?? getContext() as common.UIAbilityContext).resourceManager;  
    return rscManager.getStringSync(resource.id)  
}

这里需要Context,我们在一般类中getContext获取到的Context是什么呢?
在页面中我们通过getContext与getUIContext查看获取的Context类型,分别为AbilityContext与UIContext:
在这里插入图片描述

在viewmodel中getContext拿到的也是同一个AbitlityContext:
在这里插入图片描述

总结

本文详细介绍了HarmonyOS Next中各种Context直接关系与提供的属性和方法。

参考

Logo

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

更多推荐