likes
comments
collection
share

【最新鸿蒙应用开发】——Context上下文对象

作者站长头像
站长
· 阅读数 24

应用上下文Context

1. 概述

应用上下文(Context)是应用程序的全局信息的接口。它是一个抽象类,提供了访问应用程序环境的方法和资源的方法。应用上下文可以用于获取应用程序的资源启动Ability发送广播等。每个应用程序都有一个应用上下文对象,它在整个应用程序的生命周期内都是唯一的。通过应用上下文,我们可以获得应用程序的全局状态和信息,以及访问应用程序的资源和功能。

在HarmonyOS中,Stage模型是一种应用程序的结构模型,它涵盖了应用程序的整个生命周期。而应用上下文Context则是在Stage模型中,表示应用程序的执行环境。

总而言之,Context提供了访问应用程序资源和服务的接口。

  • 各类Context的继承关系

【最新鸿蒙应用开发】——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/ /cache
    filesDir<路径前缀>/<加密等级>/base/haps/ /files
    preferencesDir<路径前缀>/<加密等级>/base/haps/ /preferences
    tempDir<路径前缀>/<加密等级>/base/haps/ /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 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加密分区,可以有效提高应用数据的安全性。

数据加密等级:

名称说明
EL10设备级加密区,设备开机后可访问的数据区。
EL21用户级加密区,设备开机,首次输入密码后才能够访问的数据区。
EL311+2用户级加密区,不同场景的文件权限如下:已打开文件:锁屏时,可读写;解锁后,可读写。未打开文件:锁屏时,不可打开、不可读写;解锁后,可打开、可读写。创建新文件:锁屏时,可创建、可打开、可写不可读;解锁后,可创建、可打开、可读写。
EL411+3用户级加密区,不同场景的文件权限如下:已打开文件:锁屏时,FEB2.0可读写、FEB3.0不可读写;解锁后,可读写。未打开文件:锁屏时,不可打开、不可读写;解锁后,可打开、可读写。创建新文件:锁屏时,不可创建;解锁后,可创建、可打开、可读写。

要实现获取和设置当前加密分区,可以通过读写Contextarea属性来实现。


    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) { // 获取area
          this.context.area = contextConstant.AreaMode.EL1; // 修改area
        }
        // 存储普通信息

        // 存储敏感信息前,切换到EL2用户级加密
        if (this.context.area === contextConstant.AreaMode.EL1) { // 获取area
          this.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的上下文的能力,包括访问特定应用程序的资源等。

转载自:https://juejin.cn/post/7379823758419116084
评论
请登录