HarmonyOs- UIAbility应用上下文

嚴華  论坛元老 | 2025-3-27 10:59:33 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1726|帖子 1726|积分 5178

上下文为何物

上下文在计算机科学领域是一个广泛存在的概念。是当代利用体系核心抽象概念之一。其本质是环境信息的结构化封装
有过开辟经验的都知道,当我们在一个体系上举行开辟的时间,无论是Android,HarmonyOs,Linux 等等,从顶层的全体系,到窗口体系,服务体系等子体系,全部存在一个叫 上下文的 概念。 我们首先了解下这个概念,以及其计划意义,由于这个上下文,应该是很多领域步伐工程中,特定题目的通用的办理方案。了解这个一通百通。见到了新的也不怵。
更故意思的是,假如您之后要到场大型开辟,也可以搞本身的上下文概念。无非是体系的上下文涉及体系的环境信息,而您的上下文大概涉及的是业务信息。
上下文指的是,某个利用,对象或者模块在运行时所依赖的环境信息集合。例如在桌面体系中,当用户右键点击文件时,上下文菜单会根据文件范例表现不同选项(如 “解压”“编辑”),这里的 “文件范例” 和 “用户利用场景” 就是上下文的一部分。
上下文通常包含以下要素


  • 状态数据:如当前用户身份,体系主题,网络毗连状态等。
  • 设置参数:应用步伐的个性化参数,或者默认的体系参数。
  • 环境信息:实际运行中的物理环境(设备的范例),和逻辑环境(如当前地点界面,利用权限等)。
  • 关联对象:与当前利用干系的其他对象或者资源等(如打开的文件,选中的文本等)

在实现上, 上下文就是一个横向小模块,或者大模块都可以访问到的,公共信息。这个信息实例数量有限但可以共享。
但是随着工程越来越复杂,上下文会变得越来越臃肿,为了便于维护和拆分,也不得不在实现上实现局部的模块化,例如手机体系中的权限管理,我们调用的时间会是如许
  1. context.getPermissionManager().阿巴阿巴的函数继续调用
  2. //会发现权限管理被拆了,拆成了子模块,然后由context获取。
复制代码
我们现在的利用体系没有简单的,上下文很复杂也很正常。我们大致记得住可以通过上下文获取什么做到什么就可以了。遇到了题目有思路,尽量不消上网查。

我们这里以顶层计划的视角,假设您要研发一个手机体系的UI框架,并且选定了实现的模型之后,那么您的上下文应该涵盖什么呢?了解了本领边界,有利于您在业务需求之初,准确的评估实现方式以及研发资本。



在实现方面划分模块分类(下图为思路,与实际有出入)


上述模块需要的功能均可直接通过Context,直接或者间接的来访问。

ArkUI应用上下文-Context

上文中已经对Context有个大致的思想上的了解,接下来看看HarmonyOS实现框架-ArkUI中应用上下文。
这里的Context分类比较多,我们在这里偏重看下各大Context的关系。


Context的获取方式

各大context已经被各大组件纪录为一个变量,可以直接使用。在使用的时间,本身输入this.contex大致都有。像上图中右边涉及的那些类中,都可以通过this.context来获取。

Context分类

基类Context中纪录了一些基础本领,这些本领在任何子类context都得到了继承,并可以使用。
其基础信息如图所示


基础的Context主要提供了,资源管理, 当前应用信息,文件路径管理,文件分区几大本领。子类则在基础之上扩展了其他的使用比较多的本领。
应用文件路径(应用沙箱涉及到的目次)

在这里我们有必要对文件路径举行整理,以便于以后用到了内心大概有个谱。具体参考官方文档:
文档中央

各类context目次干系字段获取值及说明

属性
说明
ApplicationContext 获取的值
AbilityStageContext,UIAbilityContext,ExtensionContext获取值
bundleCodeDir
安装包目次
<路径前缀>/el1/boundle
<路径前缀>/el1/boundle
cacheDir
缓存目次
<路径前缀>/<加密等级>/base/cache
<路径前缀>/<加密等级>/base/haps/<module-name>/cache
filesDir
文件目次
<路径前缀>/<加密等级>/base/files
<路径前缀>/<加密等级>/base/haps/<module-name>/files
preferenceDir
参数设置目次
<路径前缀>/<加密等级>/base/preferences
<路径前缀>/<加密等级>/base/haps/<module-name>/references
tempDir
临时目次
<路径前缀>/<加密等级>/base/temp
<路径前缀>/<加密等级>/base/haps/<module-name>/temp
databaseDir
数据库目次
<路径前缀>/<加密等级>/database
<路径前缀>/<加密等级>/database/<module-name>
distributedFilesDir
分布式文件目次
<路径前缀>/el2/distributedFiles
<路径前缀>/el2/distributedFiles
resourceDir
资源目次
-
<路径前缀>/el1/boundle/<module-name>/resource/resfile
cloudFileDir
云文件目次
<路径前缀>/el2/cloud
<路径前缀>/el2/cloud

代码如下
  1. this.applicationContext = this.context.getApplicationContext();
  2. this.uiAbilityContext = this.context;
  3.     hilog.debug(0x0000, 'testTag', 'bundleCodeDir applicationContext=%s, uiAbilityContext=%s', this.applicationContext.bundleCodeDir, this.uiAbilityContext?.bundleCodeDir);
  4.     hilog.debug(0x0000, 'testTag', 'cacheDir applicationContext=%s, uiAbilityContext=%s', this.applicationContext.cacheDir, this.context.cacheDir);
  5.     hilog.debug(0x0000, 'testTag', 'filesDir applicationContext=%s, uiAbilityContext=%s', this.applicationContext.filesDir, this.context.filesDir);
  6.     hilog.debug(0x0000, 'testTag', 'preferenceDir applicationContext=%s, uiAbilityContext=%s', this.applicationContext.preferencesDir, this.context.preferencesDir);
  7.     hilog.debug(0x0000, 'testTag', 'tempDir applicationContext=%s, uiAbilityContext=%s', this.applicationContext.tempDir, this.context.tempDir);
  8.     hilog.debug(0x0000, 'testTag', 'databaseDir applicationContext=%s, uiAbilityContext=%s', this.applicationContext.databaseDir, this.context.databaseDir);
  9.     hilog.debug(0x0000, 'testTag', 'distributedFilesDir applicationContext=%s, uiAbilityContext=%s', this.applicationContext.distributedFilesDir, this.context.distributedFilesDir);
  10.     hilog.debug(0x0000, 'testTag', 'cloudFileDir applicationContext=%s, uiAbilityContext=%s', this.applicationContext.cloudFileDir, this.context.cloudFileDir);
  11. // 写数据案例
  12.     let filesDir = this.uiAbilityContext.filesDir + '/test1.txt'
  13.     let file = fileIo.openSync(filesDir, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE)
  14.     let writeLength = fileIo.writeSync(file.fd, 'Hello word!')
  15.     // 读数据案例
  16.     let arrayBuffer = new ArrayBuffer(1024)
  17.     let readOption : ReadOptions = {
  18.       offset : 0,
  19.       length : arrayBuffer.byteLength
  20.     }
  21.     let readLength = fileIo.readSync(file.fd, arrayBuffer, readOption)
  22.     // 将ArrayBuffer内的内容转换为Buffer
  23.     let buf = buffer.from(arrayBuffer, 0, readLength)
  24.     hilog.debug(0x0000, 'testTag', 'wright file content = %s', buf.toString())
  25.     fileIo.closeSync(file)
复制代码



获取其他Module中的context

可以通过调用createModuleContext(context : Context, modueName : string)方法,来获取其他模块的Context。并可以通过这个Context获取到其他模块的资源。
  1. applicationContext.crateModuleContext(this.context, 'entry')
  2.   .then(data:  common.Context) {
  3.     console.info('crateModuleContext=${JSON.tringify(data)}')
  4.   }.catch((err : BusinessError) => {
  5.     console.error('createModuleContext error! code=${err.code}, err msg=${err.message}')
  6.   })
复制代码

订阅历程内生命周期变化

  1. let abilityLifecycleCallback: AbilityLifecycleCallback = {
  2.       // 当UIAbility创建时被调用
  3.       onAbilityCreate(uiAbility) {
  4.         hilog.info(DOMAIN_NUMBER, TAG, `onAbilityCreate uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
  5.       },
  6.       // 当窗口创建时被调用
  7.       onWindowStageCreate(uiAbility, windowStage: window.WindowStage) {
  8.         hilog.info(DOMAIN_NUMBER, TAG, `onWindowStageCreate uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
  9.         hilog.info(DOMAIN_NUMBER, TAG, `onWindowStageCreate windowStage: ${JSON.stringify(windowStage)}`);
  10.       },
  11.       // 当窗口处于活动状态时被调用
  12.       onWindowStageActive(uiAbility, windowStage: window.WindowStage) {
  13.         hilog.info(DOMAIN_NUMBER, TAG, `onWindowStageActive uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
  14.         hilog.info(DOMAIN_NUMBER, TAG, `onWindowStageActive windowStage: ${JSON.stringify(windowStage)}`);
  15.       },
  16.       // 当窗口处于非活动状态时被调用
  17.       onWindowStageInactive(uiAbility, windowStage: window.WindowStage) {
  18.         hilog.info(DOMAIN_NUMBER, TAG, `onWindowStageInactive uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
  19.         hilog.info(DOMAIN_NUMBER, TAG, `onWindowStageInactive windowStage: ${JSON.stringify(windowStage)}`);
  20.       },
  21.       // 当窗口被销毁时被调用
  22.       onWindowStageDestroy(uiAbility, windowStage: window.WindowStage) {
  23.         hilog.info(DOMAIN_NUMBER, TAG, `onWindowStageDestroy uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
  24.         hilog.info(DOMAIN_NUMBER, TAG, `onWindowStageDestroy windowStage: ${JSON.stringify(windowStage)}`);
  25.       },
  26.       // 当UIAbility被销毁时被调用
  27.       onAbilityDestroy(uiAbility) {
  28.         hilog.info(DOMAIN_NUMBER, TAG, `onAbilityDestroy uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
  29.       },
  30.   // 当UIAbility从后台转到前台时触发回调
  31.       onAbilityForeground(uiAbility) {
  32.         hilog.info(DOMAIN_NUMBER, TAG, `onAbilityForeground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
  33.       },
  34.       // 当UIAbility从前台转到后台时触发回调
  35.       onAbilityBackground(uiAbility) {
  36.         hilog.info(DOMAIN_NUMBER, TAG, `onAbilityBackground uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
  37.       },
  38.       // 当UIAbility迁移时被调用
  39.       onAbilityContinue(uiAbility) {
  40.         hilog.info(DOMAIN_NUMBER, TAG, `onAbilityContinue uiAbility.launchWant: ${JSON.stringify(uiAbility.launchWant)}`);
  41.       }
  42.     };
  43.     // 获取应用上下文
  44.     let applicationContext = this.context.getApplicationContext();
  45.     try {
  46.       // 注册应用内生命周期回调
  47.       this.lifecycleId = applicationContext.on('abilityLifecycle', abilityLifecycleCallback);
  48.     } catch (err) {
  49.       let code = (err as BusinessError).code;
  50.       let message = (err as BusinessError).message;
  51.       hilog.error(DOMAIN_NUMBER, TAG, `Failed to register applicationContext. Code is ${code}, message is ${message}`);
  52.     }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

嚴華

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表