应用上下文Context
1. 概述
应用上下文(Context)是应用程序的全局信息的接口。它是一个抽象类,提供了访问应用程序环境的方法和资源的方法。应用上下文可以用于获取应用程序的资源、启动Ability、发送广播等。每个应用程序都有一个应用上下文对象,它在整个应用程序的生命周期内都是唯一的。通过应用上下文,我们可以获得应用程序的全局状态和信息,以及访问应用程序的资源和功能。
在HarmonyOS中,Stage模型是一种应用程序的结构模型,它涵盖了应用程序的整个生命周期。而应用上下文Context则是在Stage模型中,表示应用程序的执行环境。
总而言之,Context提供了访问应用程序资源和服务的接口。
-
各类Context的继承关系
-
各类Context的持有关系
常用的Context的获取
-
获取UIAbilityContext。每个UIAbility中都包含了一个Context属性,提供操作应用组件、获取应用组件的配置信息等能力。
import UIAbility from '@ohos.app.ability.UIAbility'; import AbilityConstant from '@ohos.app.ability.AbilityConstant'; import Want from '@ohos.app.ability.Want'; export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {let uiAbilityContext = this.context;...} }
说明:如果需要在页面中获得当前Ability的Context,可调用
getContext
接口获取当前页面关联的UIAbilityContext
-
获取特定场景ExtensionContext。以ServiceExtensionContext为例,表示后台服务的上下文环境,继承自ExtensionContext,提供后台服务相关的接口能力。
import ServiceExtensionAbility from '@ohos.app.ability.ServiceExtensionAbility'; import Want from '@ohos.app.ability.Want'; export default class MyService extends ServiceExtensionAbility {onCreate(want: Want) {let serviceExtensionContext = this.context;...} }
-
获取AbilityStageContext。Module级别的Context,和基类Context相比,额外提供HapModuleInfo、Configuration等信息。
import AbilityStage from '@ohos.app.ability.AbilityStage'; export default class MyAbilityStage extends AbilityStage {onCreate() {let abilityStageContext = this.context;...} }
-
获取ApplicationContext。应用级别的Context。ApplicationContext在基类Context的基础上提供了订阅应用内应用组件的生命周期的变化、订阅系统内存变化和订阅应用内系统环境的变化的能力,在UIAbility、ExtensionAbility、AbilityStage中均可以获取。
import UIAbility from '@ohos.app.ability.UIAbility'; import AbilityConstant from '@ohos.app.ability.AbilityConstant'; import Want from '@ohos.app.ability.Want'; export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {let applicationContext = this.context.getApplicationContext();...} }
-
2. 使用场景
常用两种场景中Context的用法:
-
获取应用文件沙箱路径
-
获取和修改加密分区
2.1. 获取应用文件沙箱路径
Context提供了获取应用文件路径的能力,ApplicationContext、AbilityStageContext、UIAbilityContext和ExtensionContext均继承该能力。获取的是应用文件的沙箱路径。
上述各类Context获取的应用文件路径有所不同。
-
通过ApplicationContext获取应用级别的应用文件路径,此路径是应用全局信息推荐的存放路径,这些文件会跟随应用的卸载而删除。
属性 路径 bundleCodeDir <路径前缀>/el1/bundle cacheDir <路径前缀>/<加密等级>/base/cache filesDir <路径前缀>/<加密等级>/base/files preferencesDir <路径前缀>/<加密等级>/base/preferences tempDir <路径前缀>/<加密等级>/base/temp databaseDir <路径前缀>/<加密等级>/database distributedFilesDir <路径前缀>/el2/distributedFiles 示例代码如下所示。
import UIAbility from '@ohos.app.ability.UIAbility'; import AbilityConstant from '@ohos.app.ability.AbilityConstant'; import Want from '@ohos.app.ability.Want'; export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {let applicationContext = this.context.getApplicationContext();let cacheDir = applicationContext.cacheDir;let tempDir = applicationContext.tempDir;let filesDir = applicationContext.filesDir;let databaseDir = applicationContext.databaseDir;let bundleCodeDir = applicationContext.bundleCodeDir;let distributedFilesDir = applicationContext.distributedFilesDir;let preferencesDir = applicationContext.preferencesDir;...// 获取应用文件路径let filePath = tempDir + 'test.txt';console.info(`filePath: ${filePath}`);} }
-
通过AbilityStageContext、UIAbilityContext、ExtensionContext获取HAP级别的应用文件路径。此路径是HAP相关信息推荐的存放路径,这些文件会跟随HAP的卸载而删除,但不会影响应用级别路径的文件,除非该应用的HAP已全部卸载。
属性 路径 bundleCodeDir <路径前缀>/el1/bundle cacheDir <路径前缀>/<加密等级>/base/haps/<module-name>/cache filesDir <路径前缀>/<加密等级>/base/haps/<module-name>/files preferencesDir <路径前缀>/<加密等级>/base/haps/<module-name>/preferences tempDir <路径前缀>/<加密等级>/base/haps/<module-name>/temp databaseDir <路径前缀>/<加密等级>/database/<module-name> distributedFilesDir <路径前缀>/el2/distributedFiles/<module-name> 示例代码如下所示。
import UIAbility from '@ohos.app.ability.UIAbility';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import Want from '@ohos.app.ability.Want';
export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {let cacheDir = this.context.cacheDir;let tempDir = this.context.tempDir;let filesDir = this.context.filesDir;let databaseDir = this.context.databaseDir;let bundleCodeDir = this.context.bundleCodeDir;let distributedFilesDir = this.context.distributedFilesDir;let preferencesDir = this.context.preferencesDir;...// 获取应用文件路径let filePath = tempDir + 'test.txt';console.info(`filePath: ${filePath}`);}
}
2.2. 获取和修改加密分区
应用文件加密是一种保护数据安全的方法,可以使得文件在未经授权访问的情况下得到保护。在不同的场景下,应用需要不同程度的文件保护。对于私有文件,如闹铃、壁纸等,应用需要将这些文件放到设备级加密分区(EL1)中,以保证在用户输入密码前就可以被访问;对于更敏感的文件,如个人隐私信息等,应用需要将这些文件放到更高级别的加密分区(EL2)中,以保证更高的安全性。
在实际应用中,开发者需要根据不同场景的需求选择合适的加密分区,从而保护应用数据的安全。通过合理使用EL1和EL2加密分区,可以有效提高应用数据的安全性。
数据加密等级:
名称 | 值 | 说明 |
---|---|---|
EL1 | 0 | 设备级加密区,设备开机后可访问的数据区。 |
EL2 | 1 | 用户级加密区,设备开机,首次输入密码后才能够访问的数据区。 |
EL311+ | 2 | 用户级加密区,不同场景的文件权限如下:已打开文件:锁屏时,可读写;解锁后,可读写。未打开文件:锁屏时,不可打开、不可读写;解锁后,可打开、可读写。创建新文件:锁屏时,可创建、可打开、可写不可读;解锁后,可创建、可打开、可读写。 |
EL411+ | 3 | 用户级加密区,不同场景的文件权限如下:已打开文件:锁屏时,FEB2.0可读写、FEB3.0不可读写;解锁后,可读写。未打开文件:锁屏时,不可打开、不可读写;解锁后,可打开、可读写。创建新文件:锁屏时,不可创建;解锁后,可创建、可打开、可读写。 |
要实现获取和设置当前加密分区,可以通过读写Context的area
属性来实现。
import UIAbility from '@ohos.app.ability.UIAbility';
import contextConstant from '@ohos.app.ability.contextConstant';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import Want from '@ohos.app.ability.Want';
export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {// 存储普通信息前,切换到EL1设备级加密if (this.context.area === contextConstant.AreaMode.EL2) { // 获取areathis.context.area = contextConstant.AreaMode.EL1; // 修改area}// 存储普通信息
// 存储敏感信息前,切换到EL2用户级加密if (this.context.area === contextConstant.AreaMode.EL1) { // 获取areathis.context.area = contextConstant.AreaMode.EL2; // 修改area}// 存储敏感信息}
}
3. 总结:
关于context相关得内容有哪些 , 他们的区别?
ApplicationContext是应用级别的Context,ApplicationContext在基类Context的基础上提供了订阅应用内Ability的生命周期的变化、订阅系统内存变化和订阅应用内系统环境的变化的能力,在UIAbility、ExtensionAbility、AbilityStage中均可以获取。
AbilityStageContext是Module级别的Context,和基类Context相比,额外提供HapModuleInfo、Configuration等信息。
UIAbilityContext是UIAbility的上下文环境,继承自Context。每个UIAbility中都包含了一个Context属性,提供操作Ability、获取Ability的配置信息、应用向用户申请授权等能力。Context模块提供了ability或application的上下文的能力,包括访问特定应用程序的资源等。