W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
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)等能力。
- import UIAbility from '@ohos.app.ability.UIAbility';
- export default class EntryAbility extends UIAbility {
- onCreate(want, launchParam) {
- let uiAbilityContext = 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。應(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中均可以獲取。
- import UIAbility from '@ohos.app.ability.UIAbility';
- export default class EntryAbility extends UIAbility {
- onCreate(want, launchParam) {
- let applicationContext = this.context.getApplicationContext();
- // ...
- }
- }
基類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>/ |
示例代碼如下。
- import UIAbility from '@ohos.app.ability.UIAbility';
- export default class EntryAbility extends UIAbility {
- onCreate(want, 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;
- // ...
- }
- }
上一個場景中,引入了加密等級的概念,通過對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ū)。
- import UIAbility from '@ohos.app.ability.UIAbility';
- export default class EntryAbility extends UIAbility {
- onCreate(want, launchParam) {
- // 存儲普通信息前,切換到EL1設(shè)備級加密
- if (this.context.area === 1) { // 獲取area
- this.context.area = 0; // 修改area
- }
- // 存儲普通信息
- // 存儲敏感信息前,切換到EL2用戶級加密
- if (this.context.area === 0) { // 獲取area
- this.context.area = 1; // 修改area
- }
- // 存儲敏感信息
- }
- }
基類Context提供創(chuàng)建其他應(yīng)用或其他Module的Context的方法為createModuleContext(moduleName:string),創(chuàng)建其他應(yīng)用或者其他Module的Context,從而通過該Context獲取相應(yīng)的資源信息(例如獲取其他Module的獲取應(yīng)用開發(fā)路徑信息)。
- import UIAbility from '@ohos.app.ability.UIAbility';
- export default class EntryAbility extends UIAbility {
- onCreate(want, launchParam) {
- let moduleName2 = "module1";
- let context2 = this.context.createModuleContext(moduleName2);
- // ...
- }
- }
在應(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)行說明。
- import UIAbility from '@ohos.app.ability.UIAbility';
- import Window from '@ohos.window';
- const TAG: string = "[Example].[Entry].[EntryAbility]";
- export default class EntryAbility extends UIAbility {
- lifecycleId: number;
- onCreate(want, launchParam) {
- let abilityLifecycleCallback = {
- onAbilityCreate(ability) {
- console.info(TAG, "onAbilityCreate ability:" + JSON.stringify(ability));
- },
- onWindowStageCreate(ability, windowStage) {
- console.info(TAG, "onWindowStageCreate ability:" + JSON.stringify(ability));
- console.info(TAG, "onWindowStageCreate windowStage:" + JSON.stringify(windowStage));
- },
- onWindowStageActive(ability, windowStage) {
- console.info(TAG, "onWindowStageActive ability:" + JSON.stringify(ability));
- console.info(TAG, "onWindowStageActive windowStage:" + JSON.stringify(windowStage));
- },
- onWindowStageInactive(ability, windowStage) {
- console.info(TAG, "onWindowStageInactive ability:" + JSON.stringify(ability));
- console.info(TAG, "onWindowStageInactive windowStage:" + JSON.stringify(windowStage));
- },
- onWindowStageDestroy(ability, windowStage) {
- console.info(TAG, "onWindowStageDestroy ability:" + JSON.stringify(ability));
- console.info(TAG, "onWindowStageDestroy windowStage:" + JSON.stringify(windowStage));
- },
- onAbilityDestroy(ability) {
- console.info(TAG, "onAbilityDestroy ability:" + JSON.stringify(ability));
- },
- onAbilityForeground(ability) {
- console.info(TAG, "onAbilityForeground ability:" + JSON.stringify(ability));
- },
- onAbilityBackground(ability) {
- console.info(TAG, "onAbilityBackground ability:" + JSON.stringify(ability));
- },
- onAbilityContinue(ability) {
- console.info(TAG, "onAbilityContinue ability:" + JSON.stringify(ability));
- }
- }
- // 1. 通過context屬性獲取applicationContext
- let applicationContext = this.context.getApplicationContext();
- // 2. 通過applicationContext注冊監(jiān)聽?wèi)?yīng)用內(nèi)生命周期
- this.lifecycleId = applicationContext.on("abilityLifecycle", abilityLifecycleCallback);
- console.info(TAG, "register callback number: " + JSON.stringify(this.lifecycleId));
- }
- onDestroy() {
- let applicationContext = this.context.getApplicationContext();
- applicationContext.off("abilityLifecycle", this.lifecycleId, (error, data) => {
- console.info(TAG, "unregister callback success, err: " + JSON.stringify(error));
- });
- }
- }
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: