背景
不管是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:
- BaseContext
- Context
- ApplicationContext
- AbilityStageContext
- UIAbilityContext
- ExtensionContext
- 其他ExtensionContext
- FormExtensionContext
- 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目录下的 [email protected]) |
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直接关系与提供的属性和方法。