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 的 resourceManagerapplicationInfo 提供了获取资源管理对象和获取应用信息的能力,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 可以获取应用级的文件路径,该路径用于存放应用全局信息,路径下的文件会跟随应用的卸载而删除
  • 通过 AbilityStageContextUIAbilityContextExtensionContext,可以获取 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/

获取和修改加密分区

基类 Contextarea 属性 (子类均继承该属性),可设置/获取加密等级,可根据不同场景的需求选择合适的加密分区,从而保护应用数据的安全。

contextConstant.AreaMode 是数据加密等级的枚举类,其值如下:

  • EL1:设备即加密区,设备开机后即可访问,不需要密码,对于私有文件,如闹铃、壁纸等可放入设备级加密分区(EL1)中
  • EL2:用户级加密区,设备开机,首次输入密码后才能访问的数据区。对于更敏感的文件,如个人隐私信息等,可放入 (EL2) 加密区中,以保证更高的安全性
  • EL3:用户级加密区,不同场景(是否锁屏、文件是否打开)的文件权限不同,对于应用中的记录步数、文件下载、音乐播放,需要在锁屏时读写和创建新文件,可放在(EL3)的加密分区
  • EL4:用户级加密区,不同场景(是否锁屏、文件是否打开)的文件权限不同,对于用户安全信息相关的文件,锁屏时不需要读写文件、也不能创建文件,可放在(EL4)的加密分区
  • EL5:应用级加密区,对于用户隐私敏感数据文件,锁屏后默认不可读写、创建文件,如果锁屏后需要读写文件,则锁屏前可以调用acquireAccess 接口申请继续读写文件,可放在(EL5)的应用级加密分区

要实现获取和设置当前加密分区,可通过基类 Contextarea 属性来实现:

// 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
      // 存储敏感信息...
  	}
  }
}

在这里插入图片描述

Logo

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

更多推荐