【愚公系列】2023年12月 HarmonyOS教学课程 050-Stage模型(应用上下文Context)
🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2023年华为云十佳博主,2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
🚀前言
应用上下文(Context)是应用程序的全局信息的接口。它是一个抽象类,提供了访问应用程序环境的方法和资源的方法。应用上下文可以用于获取应用程序的资源、启动Activity、发送广播等。每个应用程序都有一个应用上下文对象,它在整个应用程序的生命周期内都是唯一的。通过应用上下文,我们可以获得应用程序的全局状态和信息,以及访问应用程序的资源和功能。
🚀一、应用上下文Context
🔎1.概述
🦋1.1 基本概念
在HarmonyOS中,Stage模型是一种应用程序的结构模型,它涵盖了应用程序的整个生命周期。而应用上下文Context则是在Stage模型中,表示应用程序的执行环境。
Context提供了访问应用程序资源和服务的接口。它包含了应用程序的运行状态和环境信息,如应用程序的包名、进程ID、用户ID等。通过Context,应用程序可以获取应用程序的资源,如布局、字符串、动画等,也可以调用系统提供的服务,如获取位置信息、访问传感器等。
此外,Context还提供了一些方法用于启动Activity、Service、BroadcastReceiver等组件,并且可以发送和接收Intent,实现不同组件之间的通信。Context还能够管理应用程序的生命周期,比如销毁应用程序、保存和恢复数据等。
| 上下文类 | 提供的基础信息 | 提供的基本方法 |
|---|---|---|
| 基类Context | resourceManager、applicationInfo、dir、area等 | createBundleContext()、getApplicationContext()等 |
| ApplicationContext | resourceManager、applicationInfo、dir、area等 | createBundleContext()、getApplicationContext()等 |
| AbilityStageContext | resourceManager、applicationInfo、dir、area等 | createBundleContext()、getApplicationContext()等 |
| UIAbilityContext | resourceManager、applicationInfo、dir、area等 | createBundleContext()、getApplicationContext()等 |
| ExtensionContext | resourceManager、applicationInfo、dir、area等 | createBundleContext()、getApplicationContext()等 |
| ServiceExtensionContext | resourceManager、applicationInfo、dir、area等 | createBundleContext()、getApplicationContext()等 |

🦋1.2 获取方式

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

☀️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

☀️2.1.2 其他Context

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

🦋2.2 获取和修改加密分区
| 加密等级 | 说明 |
|---|---|
| AreaMode.EL1 | 设备级加密区,设备开机后可访问的数据区。 |
| AreaMode.EL2 | 用户级加密区,设备开机,首次输入密码后才能够访问的数据区。 |
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
}
// 存储敏感信息
}
}

🦋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));
});
}
}
🚀感谢:给读者的一封信
亲爱的读者,
我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。
如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。
我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。
如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。

再次感谢您的阅读和支持!
最诚挚的问候, “愚公搬代码”
- 点赞
- 收藏
- 关注作者
评论(0)