應用上下文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]中的使用為例進行說明。
`HarmonyOS與OpenHarmony鴻蒙文檔籽料: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
發布評論請先 登錄
相關推薦
評論