codecamp

应用上下文Context

概述

Context是应用中对象的上下文,其提供了应用的一些基础信息,例如resourceManager(资源管理)、applicationInfo(当前应用信息)、dir(应用开发路径)、area(文件分区)等,以及应用的一些基本方法,例如createBundleContext()、getApplicationContext()等。UIAbility组件和各种ExtensionAbility派生类组件都有各自不同的Context类。分别有基类Context、ApplicationContext、AbilityStageContext、UIAbilityContext、ExtensionContext、ServiceExtensionContext等Context。

  • 各类Context的继承关系

  • 各类Context的持有关系

  • 各类Context的获取方式

    • 获取UIAbilityContext。每个UIAbility中都包含了一个Context属性,提供操作Ability、获取Ability的配置信息、应用向用户申请授权等能力。

      1. import UIAbility from '@ohos.app.ability.UIAbility';
      2. export default class EntryAbility extends UIAbility {
      3. onCreate(want, launchParam) {
      4. let uiAbilityContext = this.context;
      5. // ...
      6. }
      7. }
    • 获取AbilityStageContext。Module级别的Context,和基类Context相比,额外提供HapModuleInfo、Configuration等信息。

      1. import AbilityStage from "@ohos.app.ability.AbilityStage";
      2. export default class MyAbilityStage extends AbilityStage {
      3. onCreate() {
      4. let abilityStageContext = this.context;
      5. // ...
      6. }
      7. }
    • 获取ApplicationContext。应用级别的Context。ApplicationContext在基类Context的基础上提供了订阅应用内Ability的生命周期的变化、订阅系统内存变化和订阅应用内系统环境的变化的能力,在UIAbility、ExtensionAbility、AbilityStage中均可以获取。

      1. import UIAbility from '@ohos.app.ability.UIAbility';
      2. export default class EntryAbility extends UIAbility {
      3. onCreate(want, launchParam) {
      4. let applicationContext = this.context.getApplicationContext();
      5. // ...
      6. }
      7. }

Context的典型使用场景

本章节通过如下典型场景来介绍Context的用法:

获取应用文件路径

基类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/

  • 通过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>/

示例代码如下。

  1. import UIAbility from '@ohos.app.ability.UIAbility';
  2. export default class EntryAbility extends UIAbility {
  3. onCreate(want, launchParam) {
  4. let cacheDir = this.context.cacheDir;
  5. let tempDir = this.context.tempDir;
  6. let filesDir = this.context.filesDir;
  7. let databaseDir = this.context.databaseDir;
  8. let bundleCodeDir = this.context.bundleCodeDir;
  9. let distributedFilesDir = this.context.distributedFilesDir;
  10. let preferencesDir = this.context.preferencesDir;
  11. // ...
  12. }
  13. }

获取和修改加密分区

上一个场景中,引入了加密等级的概念,通过对Context的area属性的读写来实现获取和设置当前加密分区,支持如下两种加密等级:

  • AreaMode.EL1:设备级加密区,设备开机后可访问的数据区。

  • AreaMode.EL2:用户级加密区,设备开机,首次输入密码后才能够访问的数据区。

  1. import UIAbility from '@ohos.app.ability.UIAbility';
  2. export default class EntryAbility extends UIAbility {
  3. onCreate(want, launchParam) {
  4. // 存储普通信息前,切换到EL1设备级加密
  5. if (this.context.area === 1) { // 获取area
  6. this.context.area = 0; // 修改area
  7. }
  8. // 存储普通信息
  9. // 存储敏感信息前,切换到EL2用户级加密
  10. if (this.context.area === 0) { // 获取area
  11. this.context.area = 1; // 修改area
  12. }
  13. // 存储敏感信息
  14. }
  15. }

创建其他应用或其他Module的Context

基类Context提供创建其他应用或其他Module的Context的方法为createModuleContext(moduleName:string),创建其他应用或者其他Module的Context,从而通过该Context获取相应的资源信息(例如获取其他Module的获取应用开发路径信息)。

调用createModuleContext(moduleName:string)方法,获取本应用中其他Module的Context。获取到其他Module的Context之后,即可获取到相应Module的资源信息。
  1. import UIAbility from '@ohos.app.ability.UIAbility';
  2. export default class EntryAbility extends UIAbility {
  3. onCreate(want, launchParam) {
  4. let moduleName2 = "module1";
  5. let context2 = this.context.createModuleContext(moduleName2);
  6. // ...
  7. }
  8. }

订阅进程内Ability生命周期变化

在应用内的DFX统计场景,如需要统计对应页面停留时间和访问频率等信息,可以使用订阅进程内Ability生命周期变化功能。

在进程内Ability生命周期变化时,如创建、可见/不可见、获焦/失焦、销毁等,会触发进入相应的回调,其中返回的此次注册监听生命周期的ID(每次注册该ID会自增+1,当超过监听上限数量2^63-1时,返回-1),以在UIAbilityContext中使用为例进行说明。

  1. import UIAbility from '@ohos.app.ability.UIAbility';
  2. import Window from '@ohos.window';
  3. const TAG: string = "[Example].[Entry].[EntryAbility]";
  4. export default class EntryAbility extends UIAbility {
  5. lifecycleId: number;
  6. onCreate(want, launchParam) {
  7. let abilityLifecycleCallback = {
  8. onAbilityCreate(ability) {
  9. console.info(TAG, "onAbilityCreate ability:" + JSON.stringify(ability));
  10. },
  11. onWindowStageCreate(ability, windowStage) {
  12. console.info(TAG, "onWindowStageCreate ability:" + JSON.stringify(ability));
  13. console.info(TAG, "onWindowStageCreate windowStage:" + JSON.stringify(windowStage));
  14. },
  15. onWindowStageActive(ability, windowStage) {
  16. console.info(TAG, "onWindowStageActive ability:" + JSON.stringify(ability));
  17. console.info(TAG, "onWindowStageActive windowStage:" + JSON.stringify(windowStage));
  18. },
  19. onWindowStageInactive(ability, windowStage) {
  20. console.info(TAG, "onWindowStageInactive ability:" + JSON.stringify(ability));
  21. console.info(TAG, "onWindowStageInactive windowStage:" + JSON.stringify(windowStage));
  22. },
  23. onWindowStageDestroy(ability, windowStage) {
  24. console.info(TAG, "onWindowStageDestroy ability:" + JSON.stringify(ability));
  25. console.info(TAG, "onWindowStageDestroy windowStage:" + JSON.stringify(windowStage));
  26. },
  27. onAbilityDestroy(ability) {
  28. console.info(TAG, "onAbilityDestroy ability:" + JSON.stringify(ability));
  29. },
  30. onAbilityForeground(ability) {
  31. console.info(TAG, "onAbilityForeground ability:" + JSON.stringify(ability));
  32. },
  33. onAbilityBackground(ability) {
  34. console.info(TAG, "onAbilityBackground ability:" + JSON.stringify(ability));
  35. },
  36. onAbilityContinue(ability) {
  37. console.info(TAG, "onAbilityContinue ability:" + JSON.stringify(ability));
  38. }
  39. }
  40. // 1. 通过context属性获取applicationContext
  41. let applicationContext = this.context.getApplicationContext();
  42. // 2. 通过applicationContext注册监听应用内生命周期
  43. this.lifecycleId = applicationContext.on("abilityLifecycle", abilityLifecycleCallback);
  44. console.info(TAG, "register callback number: " + JSON.stringify(this.lifecycleId));
  45. }
  46. onDestroy() {
  47. let applicationContext = this.context.getApplicationContext();
  48. applicationContext.off("abilityLifecycle", this.lifecycleId, (error, data) => {
  49. console.info(TAG, "unregister callback success, err: " + JSON.stringify(error));
  50. });
  51. }
  52. }
AbilityStage组件容器
Want概述
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录
HAR

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }