Bootstrap

一文搞懂HarmonyOS Next中各种Context

背景

不管是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属性:

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

true:Stage模型

false:FA模型。
Context

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

名称类型只读可选说明
resourceManagerresmgr.ResourceManager资源管理对象。
applicationInfoApplicationInfo当前应用程序的信息。
cacheDirstring缓存目录。
tempDirstring临时目录。
resourceDirstring资源目录。
filesDirstring文件目录。
databaseDirstring数据库目录。
preferencesDirstringpreferences目录。
bundleCodeDirstring安装包目录。不能拼接路径访问资源文件,请使用资源管理接口访问资源。
distributedFilesDirstring分布式文件目录。
cloudFileDir12+string云文件目录。
eventHub[EventHub事件中心,提供订阅、取消订阅、触发事件对象。
areacontextConstant.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对象、环境变化对象。提供了如下属性:

名称类型可读可写说明
currentHapModuleInfoHapModuleInfoAbilityStage对应的ModuleInfo对象。
configConfiguration环境变化对象。
UIAbilityContext

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

名称类型可读可写说明
abilityInfoAbilityInfoUIAbility的相关信息。

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

元服务API: 从API version 11开始,该接口支持在元服务中使用。
configConfiguration与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的类型作为上下文环境。

提供了以下属性:

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

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

(详见SDK目录下的 [email protected])
extensionAbilityInfoExtensionAbilityInfo所属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直接关系与提供的属性和方法。

参考

;