鸿蒙 HarmonyOS应用开发之API:Context

Context 是应用中对象的上下文,其提供了应用的一些基础信息,例如resourceManager(资源管理)、applicationInfo(当前应用信息)、dir(应用文件路径)、area(文件分区)等,以及应用的一些基本方法,例如createBundleContext()、getApplicationContext()等。UIAbility组件和各种ExtensionAbility派生类组件都有各自不同的Context类。分别有基类Context、ApplicationContext、AbilityStageContext、UIAbilityContext、ExtensionContext、ServiceExtensionContext等Context。

  • 各类Context的继承关系

  • 各类Context的持有关系

  • 各类Context的获取方式

    • 获取 UIAbilityContext 。每个UIAbility中都包含了一个Context属性,提供操作应用组件、获取应用组件的配置信息等能力。
     import UIAbility from '@ohos.app.ability.UIAbility';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) {let uiAbilityContext = this.context;...}}

说明:
页面中获取UIAbility实例的上下文信息请参见 获取UIAbility的上下文信息 。 - 获取特定场景 ExtensionContext 。以ServiceExtensionContext为例,表示后台服务的上下文环境,继承自ExtensionContext,提供后台服务相关的接口能力。

     import ServiceExtensionAbility from '@ohos.app.ability.ServiceExtensionAbility';import Want from '@ohos.app.ability.Want';export default class MyService 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() {let abilityStageContext = this.context;...}}
  • 获取ApplicationContext。应用级别的Context。ApplicationContext在基类Context的基础上提供了订阅应用内应用组件的生命周期的变化、订阅系统内存变化和订阅应用内系统环境的变化的能力,在UIAbility、ExtensionAbility、AbilityStage中均可以获取。
     import UIAbility from '@ohos.app.ability.UIAbility';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) {let applicationContext = this.context.getApplicationContext();...}}

获取应用文件路径

基类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

示例代码如下所示。

import UIAbility from '@ohos.app.ability.UIAbility';
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) {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';console.info(`filePath: ${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/

示例代码如下所示。

  import UIAbility from '@ohos.app.ability.UIAbility';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) {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';console.info(`filePath: ${filePath}`);}}

获取和修改加密分区

应用文件加密是一种保护数据安全的方法,可以使得文件在未经授权访问的情况下得到保护。在不同的场景下,应用需要不同程度的文件保护。对于私有文件,如闹铃、壁纸等,应用需要将这些文件放到设备级加密分区(EL1)中,以保证在用户输入密码前就可以被访问;对于更敏感的文件,如个人隐私信息等,应用需要将这些文件放到更高级别的加密分区(EL2)中,以保证更高的安全性。

在实际应用中,开发者需要根据不同场景的需求选择合适的加密分区,从而保护应用数据的安全。通过合理使用EL1和EL2加密分区,可以有效提高应用数据的安全性。

说明:

  • AreaMode.EL1:设备级加密区,设备开机后可访问的数据区。
  • AreaMode.EL2:用户级加密区,设备开机,首次输入密码后才能够访问的数据区。

要实现获取和设置当前加密分区,可以通过读写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设备级加密if (this.context.area === contextConstant.AreaMode.EL2) { // 获取areathis.context.area = contextConstant.AreaMode.EL1; // 修改area}// 存储普通信息// 存储敏感信息前,切换到EL2用户级加密if (this.context.area === contextConstant.AreaMode.EL1) { // 获取areathis.context.area = contextConstant.AreaMode.EL2; // 修改area}// 存储敏感信息}
}

创建其他应用或其他Module的Context

基类Context提供创建其他应用或其他Module的Context的方法有 createBundleContext(bundleName: string)、createModuleContext(moduleName: string)和createModuleContext(bundleName: string, moduleName: string) 接口,创建其他应用或者其他Module的Context,从而通过该Context获取相应的资源信息(例如获取其他Module的 获取应用文件路径 信息)。

  • 调用createBundleContext(bundleName:string)方法,创建其他应用的Context信息。 > 说明: > > 当获取的是其他应用的Context时: > > - 申请ohos.permission.GET_BUNDLE_INFO_PRIVILEGED权限,配置方式请参见配置文件权限声明。 > > - 接口为系统接口,三方应用不支持调用。

例如在桌面上显示的应用信息,包括应用名称和应用图标等,桌面应用可以通过调用上述的方法获取相应应用的Context信息从而获取到相应的应用名称、图标等资源信息。

  import UIAbility from '@ohos.app.ability.UIAbility';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) {let bundleName2 = 'com.example.application';let context2 = this.context.createBundleContext(bundleName2);let label2 = context2.applicationInfo.label;...}}
  • 调用createModuleContext(bundleName:string, moduleName:string)方法,获取指定应用指定Module的上下文信息。获取到指定应用指定Module的Context之后,即可获取到相应应用Module的资源信息。 > 说明: > > 当获取的是其他应用的指定Module的Context时: > > - 申请ohos.permission.GET_BUNDLE_INFO_PRIVILEGED权限,配置方式请参见配置文件权限声明。 > > - 接口为系统接口,三方应用不支持调用。
  import UIAbility from '@ohos.app.ability.UIAbility';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) {let bundleName2 = 'com.example.application';let moduleName2 = 'module1';let context2 = this.context.createModuleContext(bundleName2, moduleName2);...}}
  • 调用createModuleContext(moduleName:string)方法,获取本应用中其他Module的Context。获取到其他Module的Context之后,即可获取到相应Module的资源信息。
  import UIAbility from '@ohos.app.ability.UIAbility';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) {let moduleName2 = 'module1';let context2 = this.context.createModuleContext(moduleName2);...}}

订阅进程内UIAbility生命周期变化

在应用内的DFX统计场景中,如需要统计对应页面停留时间和访问频率等信息,可以使用订阅进程内UIAbility生命周期变化功能。

通过 ApplicationContext 提供的能力,可以订阅进程内UIAbility生命周期变化。当进程内的UIAbility生命周期变化时,如创建、可见/不可见、获焦/失焦、销毁等,会触发相应的回调函数。每次注册回调函数时,都会返回一个监听生命周期的ID,此ID会自增+1。当超过监听上限数量2^63-1时,会返回-1。以UIAbilityContext中的使用为例进行说明。

import UIAbility from '@ohos.app.ability.UIAbility';
import AbilityConstant from '@ohos.app.ability.AbilityConstant';
import AbilityLifecycleCallback from '@ohos.app.ability.AbilityLifecycleCallback';
import Want from '@ohos.app.ability.Want';
import window from '@ohos.window';const TAG: string = '[Example].[Entry].[EntryAbility]';export default class EntryAbility extends UIAbility {// 定义生命周期IDlifecycleId: number = -1;onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {// 定义生命周期回调对象let abilityLifecycleCallback: AbilityLifecycleCallback = {// 当UIAbility创建时被调用onAbilityCreate(uiAbility) {console.info(TAG, `onAbilityCreate uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);},// 当窗口创建时被调用onWindowStageCreate(uiAbility, windowStage: window.WindowStage) {console.info(TAG, `onWindowStageCreate uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);console.info(TAG, `onWindowStageCreate windowStage: ${JSON.stringify(windowStage)}`);},// 当窗口处于活动状态时被调用onWindowStageActive(uiAbility, windowStage: window.WindowStage) {console.info(TAG, `onWindowStageActive uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);console.info(TAG, `onWindowStageActive windowStage: ${JSON.stringify(windowStage)}`);},// 当窗口处于非活动状态时被调用onWindowStageInactive(uiAbility, windowStage: window.WindowStage) {console.info(TAG, `onWindowStageInactive uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);console.info(TAG, `onWindowStageInactive windowStage: ${JSON.stringify(windowStage)}`);},// 当窗口被销毁时被调用onWindowStageDestroy(uiAbility, windowStage: window.WindowStage) {console.info(TAG, `onWindowStageDestroy uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);console.info(TAG, `onWindowStageDestroy windowStage: ${JSON.stringify(windowStage)}`);},// 当UIAbility被销毁时被调用onAbilityDestroy(uiAbility) {console.info(TAG, `onAbilityDestroy uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);},// 当UIAbility从后台转到前台时触发回调onAbilityForeground(uiAbility) {console.info(TAG, `onAbilityForeground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);},// 当UIAbility从前台转到后台时触发回调onAbilityBackground(uiAbility) {console.info(TAG, `onAbilityBackground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);},// 当UIAbility迁移时被调用onAbilityContinue(uiAbility) {console.info(TAG, `onAbilityContinue uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);}}// 获取应用上下文let applicationContext = this.context.getApplicationContext();// 注册应用内生命周期回调this.lifecycleId = applicationContext.on('abilityLifecycle', abilityLifecycleCallback);console.info(TAG, `register callback number: ${this.lifecycleId}`);}...onDestroy() {// 获取应用上下文let applicationContext = this.context.getApplicationContext();// 取消应用内生命周期回调applicationContext.off('abilityLifecycle', this.lifecycleId);}
}

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/287189.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uni-app攻略:如何对接驰腾打印机

一.引言 在当前的移动开发生态中&#xff0c;跨平台框架如uni-app因其高效、灵活的特点受到了开发者们的青睐。同时&#xff0c;随着物联网技术的飞速发展&#xff0c;智能打印设备已成为许多业务场景中不可或缺的一环。今天&#xff0c;我们就来探讨如何使用uni-app轻松对接驰…

阿赵UE学习笔记——22、动画合成

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用。这次来看看动画合成功能。   所谓的动画合成&#xff0c;意思就是把多段已经存在的动画拼接在一起&#xff0c;成为一段新的动画。比如之前做的钢铁侠例子里面&#xff0c;钢铁侠的待机动作感觉…

零基础机器学习(3)之机器学习的一般过程

文章目录 一、机器学习一般过程1.数据获取2.特征提取3.数据预处理①去除唯一属性②缺失值处理A. 均值插补法B. 同类均值插补法 ③重复值处理④异常值⑤数据定量化 4.数据标准化①min-max标准化&#xff08;归一化&#xff09;②z-score标准化&#xff08;规范化&#xff09; 5.…

AI入侵游戏业:是颠覆者还是创新助手?揭秘未来游戏新趋势!

在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经成为各行各业的关注焦点。而在娱乐产业中&#xff0c;AI技术的引入也让人们对电子游戏的未来发展产生了无限遐想。那么&#xff0c;AI究竟会给电子游戏行业带来怎样的变革&#xff1f;它会成为行业的颠…

【嵌入式学习】Qtday03.26

一、思维导图 二、练习 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTime> #include <QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Wi…

128天创作纪念日

分享的力量 hellohello~大家好✨✨我是大耳朵土土垚&#x1f973;&#x1f973;&#x1f973;今天是我创作128天的纪念日&#x1f389;&#x1f389;&#x1f389;&#xff0c;今天听到一句话——分享自己开心的事情就像有丝分裂一样会将快乐一直扩散&#x1f496;&#x1f496…

基于前端技术实现的全面预算编制系统

前言 在现代商业环境中&#xff0c;预测销售数据和实际成本是每个公司CEO和领导都极为重视的关键指标。然而&#xff0c;由于市场的不断变化&#xff0c;准确地预测和管理这些数据变得愈发具有挑战性。为了应对这一挑战&#xff0c;建立一个高效的系统来管理和审查销售数据的重…

机器人路径规划:基于斑翠鸟优化算法(Pied Kingfisher Optimizer ,PKO)的机器人路径规划(提供MATLAB代码)

一、机器人路径规划介绍 移动机器人&#xff08;Mobile robot&#xff0c;MR&#xff09;的路径规划是 移动机器人研究的重要分支之&#xff0c;是对其进行控制的基础。根据环境信息的已知程度不同&#xff0c;路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或…

【go从入门到精通】if else 条件控制

作者简介&#xff1a; 高科&#xff0c;先后在 IBM PlatformComputing从事网格计算&#xff0c;淘米网&#xff0c;网易从事游戏服务器开发&#xff0c;拥有丰富的C&#xff0c;go等语言开发经验&#xff0c;mysql&#xff0c;mongo&#xff0c;redis等数据库&#xff0c;设计模…

行业研究数据/报告网站 - 好用免费

前言 转眼进互联网 12 年了&#xff0c;先后在百度、汽车之家、某独角兽做业务和商业分析。与CEO、VP、业务owner等都对接过&#xff0c;1 个明显共性&#xff0c;就是大家都很关注外部行业数据&#xff0c;为决策提供参考。接下来&#xff0c;就和大家分享一下我收藏的 34 个…

迷宫(蓝桥杯)——DFS和BFS

迷宫 题目描述 下图给出了一个迷宫的平面图&#xff0c;其中标记为 1 的为障碍&#xff0c;标记为 0 的为可以通行的地方。 010000 000100 001001 110000迷宫的入口为左上角&#xff0c;出口为右下角&#xff0c;在迷宫中&#xff0c;只能从一个位置走到这 个它的上、下、左…

【数据结构】双向奔赴的爱恋 --- 双向链表

关注小庄 顿顿解馋๑ᵒᯅᵒ๑ 引言&#xff1a;上回我们讲解了单链表(单向不循环不带头链表)&#xff0c;我们可以发现他是存在一定缺陷的&#xff0c;比如尾删的时候需要遍历一遍链表&#xff0c;这会大大降低我们的性能&#xff0c;再比如对于链表中的一个结点我们是无法直接…

思通舆情 是一款开源免费的舆情系统 介绍

思通舆情 是一款开源免费的舆情系统。 支持本地化部署&#xff0c;支持在线体验。 支持对海量舆情数据分析和挖掘。 无论你是使用者还是共同完善的开发者&#xff0c;欢迎 pull request 或者 留言对我们提出建议。 您的支持和参与就是我们坚持开源的动力&#xff01;请 sta…

超越Sora!StreamingT2V AI视频模型,轻松打造120秒视觉盛宴

近日&#xff0c;来自美国德克萨斯大学奥斯汀分校&#xff08;UT奥斯丁&#xff09;等机构的研究人员提出了一项名为StreamingT2V的AI视频生成技术&#xff0c;引起了业界的广泛关注。这项技术打破了传统视频生成的局限&#xff0c;实现了高度一致且长度可扩展的视频生成&#…

C语言(结构体,联合体,枚举的讲解)

这期我们来讲解结构体&#xff0c;联合体&#xff0c;以及枚举的讲解&#xff0c;首先我们从概念开始一步一步的了解。 1&#xff0c;结构体 1.1概念 C 语言中的结构体是一种用户自定义的数据类型&#xff0c;它允许你将不同类型的变量组合在一起&#xff0c;从而形成一个新…

1978-2022年全国31省社会消费品零售总额数据

1978-2022年全国31省社会消费品零售总额数据 1、时间&#xff1a;1978-2022年 2、指标&#xff1a;社会消费品零售总额 3、范围&#xff1a;31省市 4、来源&#xff1a;整理自国家统计J和各省年鉴 5、缺失情况说明&#xff1a;1997-2022年31省市均无缺失&#xff0c; 199…

海外媒体发稿:9种高效的媒体套餐内容发稿策略分析-华媒舍

海外媒体发稿&#xff1a;9种高效的媒体套餐内容发稿策略分析高效的媒体发布和营销推广策略对公司、本人的成就尤为重要。下面我们就对于媒体套餐内容发稿营销推广策略开展全面解析&#xff0c;帮助读者掌握并应用这9种合理的思路&#xff0c;进而获得更好的媒体营销效果。 1.媒…

【Python系列】Python 中 YAML 文件与字典合并的实用技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Focal Modulation Networks聚焦调制网络

摘要 我们提出了 焦点调制网络 &#xff08;简称 FocalNets) &#xff0c;其中 自注意&#xff08; SA &#xff09;被 Focal Modulation 替换&#xff0c;这种机制 包括三个组件&#xff1a;&#xff08; 1 &#xff09;通过 depth-wise Conv 提取分级的上下文信息&#xff0…

数据丢失大拯救:格式化后如何高效恢复文件

一、遭遇格式化危机&#xff0c;数据恢复有妙招 在数字化时代&#xff0c;数据丢失无疑是让人头疼的问题之一。特别是当存储设备意外格式化后&#xff0c;许多用户都会感到手足无措&#xff0c;不知如何是好。那么&#xff0c;格式化了怎么恢复呢&#xff1f;其实&#xff0c;…