上下文为何物
上下文在计算机科学领域是一个广泛存在的概念。是当代利用体系核心抽象概念之一。其本质是环境信息的结构化封装。
有过开辟经验的都知道,当我们在一个体系上举行开辟的时间,无论是Android,HarmonyOs,Linux 等等,从顶层的全体系,到窗口体系,服务体系等子体系,全部存在一个叫 上下文的 概念。 我们首先了解下这个概念,以及其计划意义,由于这个上下文,应该是很多领域步伐工程中,特定题目的通用的办理方案。了解这个一通百通。见到了新的也不怵。
更故意思的是,假如您之后要到场大型开辟,也可以搞本身的上下文概念。无非是体系的上下文涉及体系的环境信息,而您的上下文大概涉及的是业务信息。
上下文指的是,某个利用,对象或者模块在运行时所依赖的环境信息集合。例如在桌面体系中,当用户右键点击文件时,上下文菜单会根据文件范例表现不同选项(如 “解压”“编辑”),这里的 “文件范例” 和 “用户利用场景” 就是上下文的一部分。
上下文通常包含以下要素
- 状态数据:如当前用户身份,体系主题,网络毗连状态等。
- 设置参数:应用步伐的个性化参数,或者默认的体系参数。
- 环境信息:实际运行中的物理环境(设备的范例),和逻辑环境(如当前地点界面,利用权限等)。
- 关联对象:与当前利用干系的其他对象或者资源等(如打开的文件,选中的文本等)
在实现上, 上下文就是一个横向小模块,或者大模块都可以访问到的,公共信息。这个信息实例数量有限但可以共享。
但是随着工程越来越复杂,上下文会变得越来越臃肿,为了便于维护和拆分,也不得不在实现上实现局部的模块化,例如手机体系中的权限管理,我们调用的时间会是如许
- context.getPermissionManager().阿巴阿巴的函数继续调用
- //会发现权限管理被拆了,拆成了子模块,然后由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
|
代码如下
- this.applicationContext = this.context.getApplicationContext();
- this.uiAbilityContext = this.context;
- hilog.debug(0x0000, 'testTag', 'bundleCodeDir applicationContext=%s, uiAbilityContext=%s', this.applicationContext.bundleCodeDir, this.uiAbilityContext?.bundleCodeDir);
- hilog.debug(0x0000, 'testTag', 'cacheDir applicationContext=%s, uiAbilityContext=%s', this.applicationContext.cacheDir, this.context.cacheDir);
- hilog.debug(0x0000, 'testTag', 'filesDir applicationContext=%s, uiAbilityContext=%s', this.applicationContext.filesDir, this.context.filesDir);
- hilog.debug(0x0000, 'testTag', 'preferenceDir applicationContext=%s, uiAbilityContext=%s', this.applicationContext.preferencesDir, this.context.preferencesDir);
- hilog.debug(0x0000, 'testTag', 'tempDir applicationContext=%s, uiAbilityContext=%s', this.applicationContext.tempDir, this.context.tempDir);
- hilog.debug(0x0000, 'testTag', 'databaseDir applicationContext=%s, uiAbilityContext=%s', this.applicationContext.databaseDir, this.context.databaseDir);
- hilog.debug(0x0000, 'testTag', 'distributedFilesDir applicationContext=%s, uiAbilityContext=%s', this.applicationContext.distributedFilesDir, this.context.distributedFilesDir);
- hilog.debug(0x0000, 'testTag', 'cloudFileDir applicationContext=%s, uiAbilityContext=%s', this.applicationContext.cloudFileDir, this.context.cloudFileDir);
- // 写数据案例
- let filesDir = this.uiAbilityContext.filesDir + '/test1.txt'
- let file = fileIo.openSync(filesDir, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE)
- let writeLength = fileIo.writeSync(file.fd, 'Hello word!')
- // 读数据案例
- let arrayBuffer = new ArrayBuffer(1024)
- let readOption : ReadOptions = {
- offset : 0,
- length : arrayBuffer.byteLength
- }
- let readLength = fileIo.readSync(file.fd, arrayBuffer, readOption)
- // 将ArrayBuffer内的内容转换为Buffer
- let buf = buffer.from(arrayBuffer, 0, readLength)
- hilog.debug(0x0000, 'testTag', 'wright file content = %s', buf.toString())
- fileIo.closeSync(file)
复制代码

获取其他Module中的context
可以通过调用createModuleContext(context : Context, modueName : string)方法,来获取其他模块的Context。并可以通过这个Context获取到其他模块的资源。
- applicationContext.crateModuleContext(this.context, 'entry')
- .then(data: common.Context) {
- console.info('crateModuleContext=${JSON.tringify(data)}')
- }.catch((err : BusinessError) => {
- console.error('createModuleContext error! code=${err.code}, err msg=${err.message}')
- })
复制代码
订阅历程内生命周期变化
- 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();
- try {
- // 注册应用内生命周期回调
- this.lifecycleId = applicationContext.on('abilityLifecycle', abilityLifecycleCallback);
- } catch (err) {
- let code = (err as BusinessError).code;
- let message = (err as BusinessError).message;
- hilog.error(DOMAIN_NUMBER, TAG, `Failed to register applicationContext. Code is ${code}, message is ${message}`);
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |