精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙Ability Kit(程序框架服務)【應用上下文Context】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-06-06 09:22 ? 次閱讀

應用上下文Context

概述

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

  • 各類Context的繼承關系
    ![context-inheritance]
  • 各類Context的持有關系
    ![context-holding]
  • 各類Context的獲取方式
    • 獲取[UIAbilityContext]。每個UIAbility中都包含了一個Context屬性,提供操作應用組件、獲取應用組件的配置信息等能力。

      import UIAbility from '@ohos.app.ability.UIAbility';
      import type AbilityConstant from '@ohos.app.ability.AbilityConstant';
      import type Want from '@ohos.app.ability.Want';
      export default class EntryAbility extends UIAbility {
        onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
          let uiAbilityContext = this.context;
          //...
        }
      }
      

      說明:
      開發前請熟悉鴻蒙開發指導文檔 :[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]
      頁面中獲取UIAbility實例的上下文信息請參見[獲取UIAbility的上下文信息]。

    • 獲取特定場景[ExtensionContext]。以ServiceExtensionContext為例,表示后臺服務的上下文環境,繼承自ExtensionContext,提供后臺服務相關的接口能力。

      import ServiceExtensionAbility from '@ohos.app.ability.ServiceExtensionAbility';
      import type Want from '@ohos.app.ability.Want';
      export default class ServiceExtAbility 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(): void {
          let abilityStageContext = this.context;
          //...
        }
      }
      
    • 獲取[ApplicationContext]。應用級別的Context。ApplicationContext在基類Context的基礎上提供了訂閱應用內應用組件的生命周期的變化、訂閱系統內存變化和訂閱應用內系統環境的變化的能力,在UIAbility、ExtensionAbility、AbilityStage中均可以獲取。

      import UIAbility from '@ohos.app.ability.UIAbility';
      import type AbilityConstant from '@ohos.app.ability.AbilityConstant';
      import type Want from '@ohos.app.ability.Want';
      export default class EntryAbility extends UIAbility {
        onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
          let applicationContext = this.context.getApplicationContext();
          //...
        }
      }
      

Context的典型使用場景

本章節通過如下典型場景來介紹Context的用法:

  • [獲取應用文件路徑]
  • [獲取和修改加密分區]
  • [獲取本應用中其他module的context]
  • [訂閱進程內UIAbility生命周期變化]

獲取應用文件路徑

[基類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
    cloudFileDir12+<路徑前綴>/el2/hmdfs/cloud/data

    示例代碼如下所示。

    import common from '@ohos.app.ability.common';
    import hilog from '@ohos.hilog';
    import promptAction from '@ohos.promptAction';
    
    const TAG: string = '[Page_Context]';
    const DOMAIN_NUMBER: number = 0xFF00;
    @Entry
    @Component
    struct Page_Context {
      private context = getContext(this) as common.UIAbilityContext;
    
      build() {
        Column() {
          //...
          List({ initialIndex: 0 }) {
            ListItem() {
              Row() {
                //...
              }
              .onClick(() = > {
                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';
                hilog.info(DOMAIN_NUMBER, TAG, `filePath: ${filePath}`);
                if (filePath !== null) {
                  promptAction.showToast({
                    message: 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/ ****
    cloudFileDir12+<路徑前綴>/el2/hmdfs/cloud/data/ ****

    示例代碼如下所示。

    import common from '@ohos.app.ability.common';
    import hilog from '@ohos.hilog';
    import promptAction from '@ohos.promptAction';
    
    const TAG: string = '[Page_Context]';
    const DOMAIN_NUMBER: number = 0xFF00;
    @Entry
    @Component
    struct Page_Context {
      private context = getContext(this) as common.UIAbilityContext;
    
      build() {
        Column() {
          //...
          List({ initialIndex: 0 }) {
            ListItem() {
              Row() {
                //...
              }
              .onClick(() = > {
                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';
                hilog.info(DOMAIN_NUMBER, TAG, `filePath: ${filePath}`);
                if (filePath !== null) {
                  promptAction.showToast({
                    message: filePath
                  });
                }
              })
            }
            //...
          }
          //...
        }
        //...
      }
    }
    

獲取和修改加密分區

應用文件加密是一種保護數據安全的方法,可以使得文件在未經授權訪問的情況下得到保護。在不同的場景下,應用需要不同程度的文件保護。

在實際應用中,開發者需要根據不同場景的需求選擇合適的加密分區,從而保護應用數據的安全。通過合理使用不同級別的加密分區,可以有效提高應用數據的安全性。關于不同分區的權限說明,詳見[ContextConstant]的AreaMode。

  • EL1:對于私有文件,如鬧鈴、壁紙等,應用可以將這些文件放到設備級加密分區(EL1)中,以保證在用戶輸入密碼前就可以被訪問。
  • EL2:對于更敏感的文件,如個人隱私信息等,應用可以將這些文件放到更高級別的加密分區(EL2)中,以保證更高的安全性。
  • EL3:對于應用中的記錄步數、文件下載、音樂播放,需要在鎖屏時讀寫和創建新文件,放在(EL3)的加密分區比較合適。
  • EL4:對于用戶安全信息相關的文件,鎖屏時不需要讀寫文件、也不能創建文件,放在(EL4)的加密分區更合適。

要實現獲取和設置當前加密分區,可以通過讀寫[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設備級加密
    this.context.area = contextConstant.AreaMode.EL1; // 切換area
    // 存儲普通信息

    // 存儲敏感信息前,切換到EL2用戶級加密
    this.context.area = contextConstant.AreaMode.EL2; // 切換area
    // 存儲敏感信息

    // 存儲敏感信息前,切換到EL3用戶級加密
    this.context.area = contextConstant.AreaMode.EL3; // 切換area
    // 存儲敏感信息

    // 存儲敏感信息前,切換到EL4用戶級加密
    this.context.area = contextConstant.AreaMode.EL4; // 切換area
    // 存儲敏感信息
  }
}
import contextConstant from '@ohos.app.ability.contextConstant';
import common from '@ohos.app.ability.common';
import promptAction from '@ohos.promptAction';

@Entry
@Component
struct Page_Context {
  private context = getContext(this) as common.UIAbilityContext;

  build() {
    Column() {
      //...
      List({ initialIndex: 0 }) {
        //...
        ListItem() {
          Row() {
            //...
          }
          .onClick(() = > {
            // 存儲普通信息前,切換到EL1設備級加密
            if (this.context.area === contextConstant.AreaMode.EL2) { // 獲取area
              this.context.area = contextConstant.AreaMode.EL1; // 修改area
              promptAction.showToast({
                message: $r('app.string.SwitchToEL1')
              });
            }
            // 存儲普通信息
          })
        }
        //...
        ListItem() {
          Row() {
            //...
          }
          .onClick(() = > {
            // 存儲敏感信息前,切換到EL2用戶級加密
            if (this.context.area === contextConstant.AreaMode.EL1) { // 獲取area
              this.context.area = contextConstant.AreaMode.EL2; // 修改area
              promptAction.showToast({
                message: $r('app.string.SwitchToEL2')
              });
            }
            // 存儲敏感信息
          })
        }
        //...
      }
      //...
    }
    //...
  }
}

獲取本應用中其他Module的Context

調用createModuleContext(moduleName:string)方法,獲取本應用中其他Module的Context。獲取到其他Module的Context之后,即可獲取到相應Module的資源信息。

import promptAction from '@ohos.promptAction';
import common from '@ohos.app.ability.common';

let storageEventCall = new LocalStorage();

@Entry(storageEventCall)
@Component
struct Page_Context {
  private context = getContext(this) as common.UIAbilityContext;

  build() {
    Column() {
      //...
      List({ initialIndex: 0 }) {
        ListItem() {
          Row() {
            //...
          }
          .onClick(() = > {
            let moduleName2: string = 'entry';
            let moduleContext: Context = this.context.createModuleContext(moduleName2);
            if (moduleContext !== null) {
              promptAction.showToast({
                message: ('成功獲取Context')
              });
            }
          })
        }
        //...
      }
      //...
    }
    //...
  }
}

訂閱進程內UIAbility生命周期變化

在應用內的DFX統計場景中,如需要統計對應頁面停留時間和訪問頻率等信息,可以使用訂閱進程內UIAbility生命周期變化功能。

通過[ApplicationContext]提供的能力,可以訂閱進程內UIAbility生命周期變化。當進程內的UIAbility生命周期變化時,如創建、可見/不可見、獲焦/失焦、銷毀等,會觸發相應的回調函數。每次注冊回調函數時,都會返回一個監聽生命周期的ID,此ID會自增+1。當超過監聽上限數量2^63-1時,會返回-1。以[UIAbilityContext]中的使用為例進行說明。
鴻蒙文檔.png

`HarmonyOSOpenHarmony鴻蒙文檔籽料:mau123789是v直接拿`

import type AbilityConstant from '@ohos.app.ability.AbilityConstant';
import type AbilityLifecycleCallback from '@ohos.app.ability.AbilityLifecycleCallback';
import hilog from '@ohos.hilog';
import UIAbility from '@ohos.app.ability.UIAbility';
import type Want from '@ohos.app.ability.Want';
import type window from '@ohos.window';

const TAG: string = '[LifecycleAbility]';
const DOMAIN_NUMBER: number = 0xFF00;

export default class LifecycleAbility extends UIAbility {
  // 定義生命周期ID
  lifecycleId: number = -1;

  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 定義生命周期回調對象
    let abilityLifecycleCallback: AbilityLifecycleCallback = {
      // 當UIAbility創建時被調用
      onAbilityCreate(uiAbility) {
        hilog.info(DOMAIN_NUMBER, TAG, `onAbilityCreate uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
      },
      // 當窗口創建時被調用
      onWindowStageCreate(uiAbility, windowStage: window.WindowStage) {
        hilog.info(DOMAIN_NUMBER, TAG, `onWindowStageCreate uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
        hilog.info(DOMAIN_NUMBER, TAG, `onWindowStageCreate windowStage: ${JSON.stringify(windowStage)}`);
      },
      // 當窗口處于活動狀態時被調用
      onWindowStageActive(uiAbility, windowStage: window.WindowStage) {
        hilog.info(DOMAIN_NUMBER, TAG, `onWindowStageActive uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
        hilog.info(DOMAIN_NUMBER, TAG, `onWindowStageActive windowStage: ${JSON.stringify(windowStage)}`);
      },
      // 當窗口處于非活動狀態時被調用
      onWindowStageInactive(uiAbility, windowStage: window.WindowStage) {
        hilog.info(DOMAIN_NUMBER, TAG, `onWindowStageInactive uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
        hilog.info(DOMAIN_NUMBER, TAG, `onWindowStageInactive windowStage: ${JSON.stringify(windowStage)}`);
      },
      // 當窗口被銷毀時被調用
      onWindowStageDestroy(uiAbility, windowStage: window.WindowStage) {
        hilog.info(DOMAIN_NUMBER, TAG, `onWindowStageDestroy uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
        hilog.info(DOMAIN_NUMBER, TAG, `onWindowStageDestroy windowStage: ${JSON.stringify(windowStage)}`);
      },
      // 當UIAbility被銷毀時被調用
      onAbilityDestroy(uiAbility) {
        hilog.info(DOMAIN_NUMBER, TAG, `onAbilityDestroy uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
      },
      // 當UIAbility從后臺轉到前臺時觸發回調
      onAbilityForeground(uiAbility) {
        hilog.info(DOMAIN_NUMBER, TAG, `onAbilityForeground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
      },
      // 當UIAbility從前臺轉到后臺時觸發回調
      onAbilityBackground(uiAbility) {
        hilog.info(DOMAIN_NUMBER, TAG, `onAbilityBackground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
      },
      // 當UIAbility遷移時被調用
      onAbilityContinue(uiAbility) {
        hilog.info(DOMAIN_NUMBER, TAG, `onAbilityContinue uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
      }
    };
    // 獲取應用上下文
    let applicationContext = this.context.getApplicationContext();
    // 注冊應用內生命周期回調
    this.lifecycleId = applicationContext.on('abilityLifecycle', abilityLifecycleCallback);
    hilog.info(DOMAIN_NUMBER, TAG, `register callback number: ${this.lifecycleId}`);
  }

  //...

  onDestroy() : void {
    // 獲取應用上下文
    let applicationContext = this.context.getApplicationContext();
    // 取消應用內生命周期回調
    applicationContext.off('abilityLifecycle', this.lifecycleId);
  }
};

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 框架
    +關注

    關注

    0

    文章

    399

    瀏覽量

    17437
  • 鴻蒙
    +關注

    關注

    57

    文章

    2321

    瀏覽量

    42749
收藏 人收藏

    評論

    相關推薦

    鴻蒙開發接口Ability框架:【@ohos.application.Ability (Ability)】

    Ability模塊提供對Ability生命周期、上下文環境等調用管理的能力,包括Ability創建、銷毀、轉儲客戶端信息等。
    的頭像 發表于 04-30 17:42 ?2216次閱讀
    <b class='flag-5'>鴻蒙</b>開發接口<b class='flag-5'>Ability</b><b class='flag-5'>框架</b>:【@ohos.application.<b class='flag-5'>Ability</b> (<b class='flag-5'>Ability</b>)】

    鴻蒙開發接口Ability框架:【 (Context模塊)】

    Context模塊提供了ability或application的上下文的能力,包括允許訪問特定于應用程序的資源、請求和驗證權限等。
    的頭像 發表于 05-13 16:04 ?672次閱讀
    <b class='flag-5'>鴻蒙</b>開發接口<b class='flag-5'>Ability</b><b class='flag-5'>框架</b>:【 (<b class='flag-5'>Context</b>模塊)】

    鴻蒙開發接口Ability框架:【(AbilityContext)】

    AbilityContext是Ability上下文環境,繼承自Context
    的頭像 發表于 05-13 09:26 ?972次閱讀
    <b class='flag-5'>鴻蒙</b>開發接口<b class='flag-5'>Ability</b><b class='flag-5'>框架</b>:【(AbilityContext)】

    鴻蒙開發接口Ability框架:【Context

    Context模塊提供開發者運行代碼的上下文環境的能力,包括查詢和設置應用信息、ResourceManager等信息。
    的頭像 發表于 05-21 17:33 ?809次閱讀
    <b class='flag-5'>鴻蒙</b>開發接口<b class='flag-5'>Ability</b><b class='flag-5'>框架</b>:【<b class='flag-5'>Context</b>】

    關于進程上下文、中斷上下文及原子上下文的一些概念理解

    不同運行狀態,才有了上下文的概念。用戶空間的應用程序,如果想請求系統服務,比如操作某個物理設備,映射設備的地址到用戶空間,必須通過系統調用來實現。(系統調用是操作系統提供給用戶空間的接口函數)。 通過系統
    發表于 09-06 09:58

    進程上下文與中斷上下文的理解

    的切換1.進程上下文主要是異常處理程序和內核線程。內核之所以進入進程上下文是因為進程自身的一些工作需要在內核中做。例如,系統調用是為當前進程服務的,異常通常是處理進程導致的錯誤狀態等。
    發表于 12-11 19:45

    進程上下文/中斷上下文及原子上下文的概念

    為什么會有上下文這種概念進程上下文/中斷上下文及原子上下文的概念
    發表于 01-13 07:17

    HarmonyOS/OpenHarmony(Stage模型)卡片開發應用上下文Context概述

    概述 Context是應用中對象的上下文,其提供了應用的一些基礎信息,例如resourceManager(資源管理)、applicationInfo(當前應用信息)、dir(應用開發路徑)、area
    發表于 08-24 16:30

    基于Pocket PC的上下文菜單實現

    介紹了基于 Pocket PC 中的點按操作概念, 論述了在Pocket PC 中上下文菜單的實現原理及方法, 并給出了基于MFC 下的Windows CE 應用程序實現上下文菜單的步驟和代碼實例。
    發表于 07-25 18:26 ?17次下載

    基于上下文相似度的分解推薦算法

    針對移動服務推薦中用戶上下文環境復雜多變和數據稀疏性問題,提出一種基于移動用戶上下文相似度的張量分解推薦算法-UCS-TF。該算法組合用戶間的多維上下文相似度和
    發表于 11-27 17:42 ?0次下載

    Web服務上下文的訪問控制策略模型

    Web服務環境中,交互實體通常位于不同安全域,具有不可預見性。Web服務應該基于其他與領域無關的信息而非身份來實施訪問控制,以實現對跨域未知用戶的訪問授權。為此,提出了適應于Web服務的基于
    發表于 01-05 16:32 ?0次下載

    鴻蒙開發接口Ability框架:【AbilityStageContext】

    AbilityStageContext是AbilityStage的上下文環境,繼承自[Context]。
    的頭像 發表于 05-15 15:51 ?540次閱讀
    <b class='flag-5'>鴻蒙</b>開發接口<b class='flag-5'>Ability</b><b class='flag-5'>框架</b>:【AbilityStageContext】

    鴻蒙開發接口Ability框架:【Context

    Context模塊提供開發者運行代碼的上下文環境的能力,包括查詢和設置應用信息、ResourceManager等信息。
    的頭像 發表于 05-15 15:29 ?536次閱讀
    <b class='flag-5'>鴻蒙</b>開發接口<b class='flag-5'>Ability</b><b class='flag-5'>框架</b>:【<b class='flag-5'>Context</b>】

    鴻蒙開發接口Ability框架:【ExtensionContext】

    ExtensionContext是Extension的上下文環境,繼承自Context
    的頭像 發表于 05-15 17:34 ?292次閱讀
    <b class='flag-5'>鴻蒙</b>開發接口<b class='flag-5'>Ability</b><b class='flag-5'>框架</b>:【ExtensionContext】

    鴻蒙Ability Kit程序框架服務)【UIAbility組件基本用法】

    UIAbility組件的基本用法包括:指定UIAbility的啟動頁面以及獲取UIAbility的上下文[UIAbilityContext]。
    的頭像 發表于 06-06 11:02 ?427次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>Ability</b> <b class='flag-5'>Kit</b>(<b class='flag-5'>程序</b><b class='flag-5'>框架</b><b class='flag-5'>服務</b>)【UIAbility組件基本用法】