ArkTS -- Context (Stage 模型的应用上下文)
Context (Stage 模型的上下文基类) API 参考文档
导入模块
import { common } from '@kit.AbilityKit';
Context 是 Stage 模型的上下文基类,即
this.context.stageMode的值为 true
Context 模块继承自 BaseContext,提供了应用的一些基础信息,如 resourceManager(资源管理)、applicationInfo(当前应用信息)、area(文件分区)等。
不同类型的 Context
UIContext 是指 UI 实例上下文,用于关联窗口与 UI 页面,提供 UI 操作相关能力,与 Context 无直接关联,不存在继承或持有关系。但是 UIContext 提供了
UIContext.getHostContext方法获取当前组件所在 Ability 的 Context。
UIAbility 组件和各种 ExtensionAbility 派生类组件都有各自不同的 Context。分别有基类 Context、ApplicationContext、AbilityStateContext、UIAbilityContext、ExtensionContext 等。
不同类型的 Context 具有不同的能力,不可相互代替或强行转换。例如,ApplicationContext 绑定了 setFontSizeScale 方法,但 UIAbilityContext 中没有此方法。
不同类型 Context 的继承关系

不同类型 Context 的持有关系

Context 的获取方式
获取 ApplicationContext (应用的全局上下文)
ApplicationContext 在 UIAbility、ExtensionAbility、AbilityStage 中均可以获取。Context 的子类都可以通过 getApplicationContext 获取到 ApplicationContext。
【示例】
import { common, UIAbility } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
export default class EntryAbility extends UIAbility {
onCreate() {
console.log('MyAbility onCreate');
let applicationContext: common.Context;
try {
applicationContext = this.context.getApplicationContext();
} catch (error) {
console.error(`getApplicationContext failed, error.code: ${(error as BusinessError).code}, error.message: ${(error as BusinessError).message}`);
}
}
}
获取 AbilityStageContext (模块级别的上下文)
对当前 AbilityStage 的 Context,可直接通过 AbilityStage 实例获取 context 属性
export default class MyAbilityStage extends AbilityStage {
onCreate(): void {
let abilityStageContext = this.context;
//...
}
}
对本应用中其它 Module,需调用 application.createModuleContext 获取其 AbilityStageContext。
application.createModuleContext
application 是应用工具类 (@ohos.app.ablility.application)。
导入 application 模块
import { application } from '@kit.AbilityKit';
application.createModuleContext 用于创建指定 module 的上下文。创建出的模块上下文中 resourceManager.Configuration 资源继承自入参上下文,便于获取跨 HAP/HSP 包应用资源。
【示例】
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
let moduleContext: common.Context;
try {
//获取指定 module 的上下文 (入参 entry 为指定 module 的 moduleName)
application.createModuleContext(this.context, 'entry').then((data: Context) => {
moduleContext = data; //指定的 HAP/HSP 包的 context;
console.info('createBundleContext success!');
}).catch((error: BusinessError) => {
let code: number = (error as BusinessError).code;
let message: string = (error as BusinessError).message;
console.error(`createModuleContext failed, error.code: ${code}, error.message: ${message}`);
});
} catch (error) {
let code: number = (error as BusinessError).code;
let message: string = (error as BusinessError).message;
console.error(`createModuleContext failed, error.code: ${code}, error.message: ${message}`);
}
}
}
获取 UIAbilityContext (UIAbility 组件的上下文)
- 在 UIAbility 中可以直接通过 this.context 获取 UIAbility 实例的上下文信息
- 在组件/页面中获取 UIAbility 实例的上下文信息,有以下两种方式
@Entry @Component struct MyPage { // 方式一:在 UIAbility 中通过 this.getUIContext().getHostContext() 获取的即为 UIAbilityContext,直接转换类型 private context1 = this.getUIContext().getHostContext() as common.UIAbilityContext; // 方式二:获取基类 Context,强转类型 private context2 = getContext(this) as common.UIAbilityContext; // 页面展示 build() { // ... } }
获取 ExtensionContext (组件级的 Context)
不同类型的 ExtensionContext 能力不同,以输入法上下文 InputMethodExtensionContext 为例。
InputMethodExtensionContext 是 InputMethodExtensionAbility 的上下文,继承自 ExtensionContext,提供输入法相关的接口能力。
【示例】
// InputMethodExtAbility: 输入法模块,支持开发自定义的输入法应用,以级管理输入法应用的生命周期
class InputMethodExtAbility extends InputMethodExtensionAbility {
onCreate(want: Want): void {
const context = this.context; //InputMethodExtensionAbility 的上下文信息,即为 InputMethodExtensionContext
const targetWant: Want = {
bundleName: "com.example.aafwk.test",
abilityName: "com.example.aafwk.test.TwoAbility"
};
//拉起目标应用
context.startAbility(targetWant)
.then(() => console.info('startAbility success'))
.catch((err: BusinessError) => {
console.error(`StartAbility failed. Code: ${err.code}, Message: ${err.message}`);
});
}
onDestroy() {
//销毁输入法应用
this.context.destroy().then(() => {
console.info('Succeed in destroying context.');
}).catch((err: BusinessError)=>{
console.error(`Failed to destroy context, err code = ${err.code}`);
});
}
}
Context 的通用场景
获取基本信息
基类 Context 的 resourceManager 和 applicationInfo 提供了获取资源管理对象和获取应用信息的能力,ApplicationContext、AbilityStageContext、UIAbilityContext 和 ExtensionContext 均继承该能力。
| 名称 | 类型 | 只读 | 可选 | 说明 |
|---|---|---|---|---|
| resourceManager | resmgr.ResourceManager | 否 | 否 | 资源管理对象 |
| applicationInfo | ApplicationInfo | 否 | 否 | 当前应用程序的信息 |
【示例】
通过 ApplicationContext 获取资源管理和当前应用信息:
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// 获取ResourceManager(资源管理)
let resourceManager = this.context.getApplicationContext().resourceManager;
// 获取applicationInfo(当前应用信息)
let applicationInfo = this.context.getApplicationContext().applicationInfo;
//...
}
}
此外,不同类型的 Context 还有其独立的方法和属性
| 属性 | 类型 | ApplicationContext | UIAbilityContex t | AbilityStageContext | ExtensionContext |
|---|---|---|---|---|---|
| abilityInfo | AbilityInfo | / | UIAbility 信息 | / | / |
| windowStage | window.WindowStage | / | 当前 WindowStage 对象 | / | / |
| currentHapModuleInfo | HapModuleInfo | / | 当前 UIAbility 所属 HAP 的信息 | 当前 AbilityStage 对应的 ModuleInfo 对象 | 所属 Hap 包的信息 |
| config | Configuration | / | 与 UIAbility 相关的配置信息,如语言、颜色模式等 | 环境变量 | 所属 Module 的配置信息 |
| extensionAbilityInfo | ExtensionAbilityInfo | / | / | / | 所属Extension的信息 |
获取文件路径
基类 Context 提供了获取应用文件路径的能力,ApplicationContext、AbilityStageContext、UIAbilityContext 和 ExtensionContext 均继承该能力,但不同类型的 Context 获取的路径可能存在差异。
- 通过 ApplicationContext 可以获取应用级的文件路径,该路径用于存放应用全局信息,路径下的文件会跟随应用的卸载而删除
- 通过 AbilityStageContext、UIAbilityContext、ExtensionContext,可以获取 Module 级的文件路径。该路径用于存放 Module 相关信息,路径下的文件会跟随 HAP/HSP 的卸载而删除,HAP/HSP 的卸载不会影响应用级路径下的文件,除非该应用的 HAP/HSP 已全部卸载
- UIAbilityContext:可以获取 UIAbility 所在 Module 的文件路径
- ExtensionContext:可以获取 ExtensionAbility 所在 Module 的文件路径
- AbilityStageContext:由于 AbilityStageContext 创建时机早于 UIAbilityContext 和 ExtensionContext,通常用于在 AbilityStage 中获取文件路径
应用文件路径属于应用沙箱路径
| 属性 | 说明 | Application 获取的路径 | 其它 Context 子类获取的路径 |
|---|---|---|---|
| bundleCodeDir | 安装包目录 | <路径前缀>/el/bundle | <路径前缀>/el1/bundle |
| cacheDir | 缓存目录 | <路径前缀>/<加密等级>/base/cache | <路径前缀>/<加密等级>/base/haps/<module-name>/cache |
| filesDir | 文件目录 | <路径前缀>/<加密等级>/base/files | <路径前缀>/<加密等级>/base/haps/<module-name>/files |
| preferencesDir | preferences目录 | <路径前缀>/<加密等级>/base/preferences | <路径前缀>/<加密等级>/base/haps/<module-name>/preferences |
| tempDir | 临时目录 | <路径前缀>/<加密等级>/base/temp | <路径前缀>/<加密等级>/base/haps/<module-name>/temp |
| databaseDir | 数据库目录 | <路径前缀>/<加密等级>/database | <路径前缀>/<加密等级>/database/<module-name> |
| distributedFilesDir | 分布式文件目录 | <路径前缀>/el2/distributedFiles | <路径前缀>/el2/distributedFiles/ |
| resourceDir | 资源目录 (需手动在 <module-name>\resource 路径下创建 resfile 目录) |
不涉及 | <路径前缀>/el1/bundle/<module-name>/resources/resfile |
| cloudFileDir | 云文件目录 | <路径前缀>/el2/cloud | <路径前缀>/el2/cloud/ |
获取和修改加密分区
基类 Context 的 area 属性 (子类均继承该属性),可设置/获取加密等级,可根据不同场景的需求选择合适的加密分区,从而保护应用数据的安全。
contextConstant.AreaMode 是数据加密等级的枚举类,其值如下:
- EL1:设备即加密区,设备开机后即可访问,不需要密码,对于私有文件,如闹铃、壁纸等可放入设备级加密分区(EL1)中
- EL2:用户级加密区,设备开机,首次输入密码后才能访问的数据区。对于更敏感的文件,如个人隐私信息等,可放入 (EL2) 加密区中,以保证更高的安全性
- EL3:用户级加密区,不同场景(是否锁屏、文件是否打开)的文件权限不同,对于应用中的记录步数、文件下载、音乐播放,需要在锁屏时读写和创建新文件,可放在(EL3)的加密分区
- EL4:用户级加密区,不同场景(是否锁屏、文件是否打开)的文件权限不同,对于用户安全信息相关的文件,锁屏时不需要读写文件、也不能创建文件,可放在(EL4)的加密分区
- EL5:应用级加密区,对于用户隐私敏感数据文件,锁屏后默认不可读写、创建文件,如果锁屏后需要读写文件,则锁屏前可以调用acquireAccess 接口申请继续读写文件,可放在(EL5)的应用级加密分区
要实现获取和设置当前加密分区,可通过基类 Context 的 area 属性来实现:
// EntryAbility.ets
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
if(this.contex.area == contextConstant.AreaMod.EL2) { //获取 area
// 存储敏感信息前,切换到EL4用户级加密
this.context.area = contextConstant.AreaMode.EL4; // 切换area
// 存储敏感信息...
}
}
}

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)