鴻蒙HarmonyOS實戰-Stage模型(應用上下文Context)

蜀道山QAQ發表於2024-05-23

🚀前言

應用上下文(Context)是應用程式的全域性資訊的介面。它是一個抽象類,提供了訪問應用程式環境的方法和資源的方法。應用上下文可以用於獲取應用程式的資源、啟動Activity、傳送廣播等。每個應用程式都有一個應用上下文物件,它在整個應用程式的生命週期內都是唯一的。透過應用上下文,我們可以獲得應用程式的全域性狀態和資訊,以及訪問應用程式的資源和功能。

🚀一、應用上下文Context

🔎1.概述

🦋1.1 基本概念

在HarmonyOS中,Stage模型是一種應用程式的結構模型,它涵蓋了應用程式的整個生命週期。而應用上下文Context則是在Stage模型中,表示應用程式的執行環境。

Context提供了訪問應用程式資源和服務的介面。它包含了應用程式的執行狀態和環境資訊,如應用程式的包名、程序ID、使用者ID等。透過Context,應用程式可以獲取應用程式的資源,如佈局、字串、動畫等,也可以呼叫系統提供的服務,如獲取位置資訊、訪問感測器等。

此外,Context還提供了一些方法用於啟動Activity、Service、BroadcastReceiver等元件,並且可以傳送和接收Intent,實現不同元件之間的通訊。Context還能夠管理應用程式的生命週期,比如銷燬應用程式、儲存和恢復資料等。

image

image

🦋1.2 獲取方式

image

☀️1.2.1 UIAbilityContext

提供操作Ability、獲取Ability的配置資訊、應用向使用者申請授權等能力。

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

image

☀️1.2.2 AbilityStageContext

和基類Context相比,額外提供HapModuleInfo、Configuration等資訊

import AbilityStage from "@ohos.app.ability.AbilityStage";
export default class MyAbilityStage extends AbilityStage {
    onCreate() {
        let abilityStageContext = this.context;
        // ...
    }
}
☀️1.2.3 ApplicationContext

ApplicationContext在基類Context的基礎上提供了訂閱應用內Ability的生命週期的變化、訂閱系統記憶體變化和訂閱應用內系統環境的變化的能力,在UIAbility、ExtensionAbility、AbilityStage中均可以獲取。

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

🔎2.Context的典型使用場景

🦋2.1 獲取應用檔案路徑

☀️2.1.1 ApplicationContext

image

☀️2.1.2 其他Context

image

☀️2.1.3 案例
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;
        // ...
    }
}

image

🦋2.2 獲取和修改加密分割槽

image

import UIAbility from '@ohos.app.ability.UIAbility';

export default class EntryAbility extends UIAbility {
    onCreate(want, launchParam) {
        // 儲存普通訊息前,切換到EL1裝置級加密
        if (this.context.area === 1) { // 獲取area
            this.context.area = 0;     // 修改area
        }
        // 儲存普通訊息

        // 儲存敏感資訊前,切換到EL2使用者級加密
        if (this.context.area === 0) { // 獲取area
            this.context.area = 1;     // 修改area
        }
        // 儲存敏感資訊
    }
}

image

🦋2.3 建立其他應用或其他Module的Context

在HarmonyOS中,createModuleContext是一個函式,用於建立模組上下文(ModuleContext)物件。模組上下文用於管理模組的生命週期,並提供模組間通訊的機制。

使用createModuleContext函式,可以在模組的入口處建立一個模組上下文物件,並將其傳遞給模組的其他元件。透過模組上下文物件,可以獲取到模組的配置資訊、上下文等相關的資源。

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);
        // ...
    }
}

🦋2.4 訂閱程序內Ability生命週期變化

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註冊監聽應用內生命週期
        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));
        });
    }
}

🚀寫在最後

  • 如果你覺得這篇內容對你還蠻有幫助,我想邀請你幫我三個小忙:
  • 點贊,轉發,有你們的 『點贊和評論』,才是我創造的動力。
  • 關注小編,同時可以期待後續文章ing🚀,不定期分享原創知識。
  • 更多鴻蒙最新技術知識點,請關注作者部落格:https://t.doruo.cn/14DjR1rEY

image

相關文章