應(yīng)用上下文Context

2024-01-25 12:24 更新

概述

Context是應(yīng)用中對象的上下文,其提供了應(yīng)用的一些基礎(chǔ)信息,例如resourceManager(資源管理)、applicationInfo(當(dāng)前應(yīng)用信息)、dir(應(yīng)用開發(fā)路徑)、area(文件分區(qū))等,以及應(yīng)用的一些基本方法,例如createBundleContext()、getApplicationContext()等。UIAbility組件和各種ExtensionAbility派生類組件都有各自不同的Context類。分別有基類Context、ApplicationContext、AbilityStageContext、UIAbilityContext、ExtensionContext、ServiceExtensionContext等Context。

  • 各類Context的繼承關(guān)系

  • 各類Context的持有關(guān)系

  • 各類Context的獲取方式

    • 獲取UIAbilityContext。每個UIAbility中都包含了一個Context屬性,提供操作Ability、獲取Ability的配置信息、應(yīng)用向用戶申請授權(quán)等能力。

      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。應(yīng)用級別的Context。ApplicationContext在基類Context的基礎(chǔ)上提供了訂閱應(yīng)用內(nèi)Ability的生命周期的變化、訂閱系統(tǒng)內(nèi)存變化和訂閱應(yīng)用內(nèi)系統(tǒng)環(huán)境的變化的能力,在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. }

獲取應(yīng)用文件路徑

基類Context提供了獲取應(yīng)用文件路徑的能力,ApplicationContext、AbilityStageContext、UIAbilityContext和ExtensionContext均繼承該能力。應(yīng)用文件路徑屬于應(yīng)用沙箱路徑,具體請參見應(yīng)用沙箱目錄。

上述各類Context獲取的應(yīng)用文件路徑有所不同。

  • 通過ApplicationContext獲取應(yīng)用級別的應(yīng)用文件路徑,此路徑是應(yīng)用全局信息推薦的存放路徑,這些文件會跟隨應(yīng)用的卸載而刪除。

    屬性

    路徑

    bundleCodeDir

    <路徑前綴>/el1/bundle/

    cacheDir

    <路徑前綴>/<加密等級>/base/cache/

    filesDir

    <路徑前綴>/<加密等級>/base/files/

    preferencesDir

    <路徑前綴>/<加密等級>/base/preferences/

    tempDir

    <路徑前綴>/<加密等級>/base/temp/

    databaseDir

    <路徑前綴>/<加密等級>/database/

    distributedFilesDir

    <路徑前綴>/el2/distributedFiles/

  • 通過AbilityStageContext、UIAbilityContext、ExtensionContext獲取HAP級別的應(yīng)用文件路徑。此路徑是HAP相關(guān)信息推薦的存放路徑,這些文件會跟隨HAP的卸載而刪除,但不會影響應(yīng)用級別路徑的文件,除非該應(yīng)用的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. }

獲取和修改加密分區(qū)

上一個場景中,引入了加密等級的概念,通過對Context的area屬性的讀寫來實現(xiàn)獲取和設(shè)置當(dāng)前加密分區(qū),支持如下兩種加密等級:

  • AreaMode.EL1:設(shè)備級加密區(qū),設(shè)備開機(jī)后可訪問的數(shù)據(jù)區(qū)。

  • AreaMode.EL2:用戶級加密區(qū),設(shè)備開機(jī),首次輸入密碼后才能夠訪問的數(shù)據(jù)區(qū)。

  1. import UIAbility from '@ohos.app.ability.UIAbility';
  2. export default class EntryAbility extends UIAbility {
  3. onCreate(want, launchParam) {
  4. // 存儲普通信息前,切換到EL1設(shè)備級加密
  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. }

創(chuàng)建其他應(yīng)用或其他Module的Context

基類Context提供創(chuàng)建其他應(yīng)用或其他Module的Context的方法為createModuleContext(moduleName:string),創(chuàng)建其他應(yīng)用或者其他Module的Context,從而通過該Context獲取相應(yīng)的資源信息(例如獲取其他Module的獲取應(yīng)用開發(fā)路徑信息)。

調(diào)用createModuleContext(moduleName:string)方法,獲取本應(yīng)用中其他Module的Context。獲取到其他Module的Context之后,即可獲取到相應(yīng)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. }

訂閱進(jìn)程內(nèi)Ability生命周期變化

在應(yīng)用內(nèi)的DFX統(tǒng)計場景,如需要統(tǒng)計對應(yīng)頁面停留時間和訪問頻率等信息,可以使用訂閱進(jìn)程內(nèi)Ability生命周期變化功能。

在進(jìn)程內(nèi)Ability生命周期變化時,如創(chuàng)建、可見/不可見、獲焦/失焦、銷毀等,會觸發(fā)進(jìn)入相應(yīng)的回調(diào),其中返回的此次注冊監(jiān)聽生命周期的ID(每次注冊該ID會自增+1,當(dāng)超過監(jiān)聽上限數(shù)量2^63-1時,返回-1),以在UIAbilityContext中使用為例進(jìn)行說明。

  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注冊監(jiān)聽?wèi)?yīng)用內(nèi)生命周期
  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. }
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號