鸿蒙Next应用上下文Context总结

在开发中,通过会涉及到不同的Context,比如要监听应用的前后台状态变化需要用到ApplicationContext,启动一个ability需要用到UIAbilityContext,配置键盘避让模式需要用到UIContext,今天总结一下各个context的作用和区别。

ApplicationContext

ApplicationContext模块继承自Context,为开发者提供应用级别的上下文的能力
// 1.通过context属性获取applicationContext
let applicationContext = this.context.getApplicationContext();
//注册对当前应用前后台状态变化的监听
try {
  // 2.通过applicationContext注册应用前后台状态监听
  applicationContext.on('applicationStateChange', {
    onApplicationForeground() {},
    onApplicationBackground() {}
  });
} catch (paramError) {}
//3.获取有关运行进程的信息
applicationContext.getRunningProcessInformation().then((data) => {
//pid   进程ID。
//uid   用户ID
//processName  进程名称
//bundleNames  进程中所有运行的Bundle名称
//state   当前进程状态
}).catch((error: BusinessError) => {
});
//4.终止应用的所有进程
applicationContext.killAllProcesses();
//5.设置应用的深浅色模式。仅支持主线程调用
applicationContext.setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_DARK);

AbilityStageContext

AbilityStageContext是AbilityStage的上下文环境,继承自Context,提供允许访问特定于abilityStage的资源的能力,获取HapModuleInfo、Configuration信息
let abilityStageContext = this.context;
// 获取当前模块名
let name = abilityStageContext.currentHapModuleInfo.name;
// 获取当前模块语言
let language = abilityStageContext.config.language;

HapModuleInfo

名称说明
name模块名称
icon模块图标
iconId模块图标的资源id值
label模块标签
labelId模块标签的资源id值
description模块描述信息
descriptionId描述信息的资源id值
mainElementName当前模块的入口UIAbility名称
abilitiesInfoAbility信息
Configuration
名称说明
language表示应用程序的当前语言,例如“zh"
colorMode表示深浅色模式
direction表示屏幕方向
screenDensity表示屏幕像素密度
displayId表示应用所在的物理屏幕ID
hasPointerDevice指针类型设备是否已连接,如键鼠、触控板

UIAbilityContext

UIAbilityContext是UIAbility组件的上下文,继承自Context。获取组件信息AbilityInfo、获取应用信息ApplicationInfo、拉起其他UIAbility、连接系统服务、销毁UIAbility等
//Ability中获取
this.context
//UI组件中获取
let context = this.getUIContext().getHostContext() as common.UIAbilityContext;

//启动一个Ability
startAbility(want: Want, options?: StartOptions)
//启动一个UIAbility,并通过回调函数接收被拉起的UIAbility退出时的返回结果
startAbilityForResult(want: Want, options: StartOptions, callback: AsyncCallback<AbilityResult>)
//设置UIAbility任务的流转状态
setMissionContinueState(state: AbilityConstant.ContinueState, callback: AsyncCallback<void>)
//启动一个支持模态弹框的ServiceExtensionAbility
requestDialogService(want: Want, result: AsyncCallback<dialogRequest.RequestResult>)
//销毁UIAbility自身
terminateSelf(callback: AsyncCallback<void>)

UIContext

ArkUI的UI实例上下文,提供UI操作相关的能力
//在存在Window实例的情况下
onWindowStageCreate(windowStage: window.WindowStage): void {
  this.uiContext= windowStage.getMainWindowSync().getUIContext()
}
//在UI组件内获取
uiContext = this.getUIContext()
//获取组件大小、位置、平移、缩放、旋转及仿射矩阵属性信息。
let componentUtils: ComponentUtils = uiContext.getComponentUtils();
let modePosition = componentUtils.getRectangleById("onClick");
let localOffsetWidth = modePosition.size.width;
let localOffsetHeight = modePosition.size.height;
let localOffsetX = modePosition.localOffset.x;// 获取组件相对于父组件的x轴偏移
let localOffsetY = modePosition.localOffset.y;// 获取组件相对于父组件的y轴偏移
//获取到PromptAction对象
let promptAction: PromptAction = uiContext.getPromptAction();
//创建并显示文本提示框
promptAction.showToast(options: promptAction.ShowToastOptions)
//创建并显示对话框
promptAction.showDialog(options: promptAction.ShowDialogOptions)
//创建并显示操作菜单
promptAction.showActionMenu(options: promptAction.ActionMenuOptions)
//创建并弹出自定义弹窗
promptAction.openCustomDialog(options: promptAction.CustomDialogOptions)
//显示警告弹窗组件
uiContext.showAlertDialog(options: AlertDialogParamWithConfirm | AlertDialogParamWithButtons | AlertDialogParamWithOptions)
//定义列表弹窗并弹出
uiContext.showActionSheet(value: ActionSheetOptions)
//定义日期滑动选择器弹窗并弹出
uiContext.showDatePickerDialog(options: DatePickerDialogOptions)
//定义时间滑动选择器弹窗并弹出
uiContext.showTimePickerDialog(options: TimePickerDialogOptions)
//定义文本滑动选择器弹窗并弹出
uiContext.showTextPickerDialog(options: TextPickerDialogOptions)
//配置虚拟键盘弹出时,页面的避让模式
uiContext.setKeyboardAvoidMode(value: KeyboardAvoidMode)
//获取Router对象
uiContext.getRouter();
//代码控制弹出软键盘
this.getUIContext().getFocusController().requestFocus('指定输入框id');
//代码控制收起软键盘
this.getUIContext().getFocusController().clearFocus();
//返回当前组件所在Ability的Context,在UIAbility窗口中的页面调用该接口,返回类型为UIAbilityContext
this.getUIContext().getHostContext()
//计算指定文本单行布局下的宽度
this.uiContext.getMeasureUtils().measureText(options: MeasureOptions)

不同类型Context的继承关系

不同类型Context的继承关系.png

不同类型Context的持有关系

不同类型Context的持有关系.png

注意:

UIContext是指UI实例上下文,用于关联窗口与UI页面。与本文档中的应用上下文Context无直接关联,不存在继承或持有关系

<think>我们正在查找关于鸿蒙系统中使用`next`或`readTextSync`的相关信息或用法。根据提供的引用,我们可以提取以下关键点:1.引用[4]中提到了`readTextSync`的使用示例:```typescriptletcacheFilePath=context.cacheDir+'/ComputeResult.txt';letcomputeResult=JSON.parse(fs.readTextSync(cacheFilePath));```这里,`readTextSync`是用于同步读取文件内容的方法,它读取指定路径的文件并返回文本内容。然后通过`JSON.parse`解析为对象。2.引用[5]中提到了`next`在鸿蒙NEXT中可能是指鸿蒙NEXT版本(即鸿蒙的下一代版本),并且介绍了一个下载方法`downloadToFile`,但并没有直接使用`next`作为关键字的方法。因此,我们可以推断:-`readTextSync`是鸿蒙系统中文件系统(fs模块)的一个同步读取文本文件的方法。-而`next`可能是指鸿蒙NEXT版本,也可能在上下文中指代其他含义(比如迭代器的next方法?),但根据问题描述,用户可能是在鸿蒙NEXT版本中使用`readTextSync`。由于引用中没有直接出现`next`与`readTextSync`组合使用的例子,我们主要关注`readTextSync`的用法。根据引用[4]的示例,我们可以总结`readTextSync`的使用步骤:1.获取应用上下文(UIAbilityContext)。2.构造文件路径(通常使用沙箱目录,如缓存目录cacheDir)。3.使用`fs.readTextSync`同步读取文件内容。4.处理读取的内容(例如解析JSON)。下面给出一个使用`readTextSync`的完整示例代码(基于引用[4]的上下文):</think>### 鸿蒙系统 `readTextSync` 用法详解 在鸿蒙系统(HarmonyOS NEXT)中,`readTextSync` 是文件系统(fs模块)提供的**同步读取文本文件**的方法,主要用于读取应用沙箱内的文本文件内容。以下是具体用法和示例: --- ### 核心用法说明 ```typescript import fs from '@ohos.file.fs'; // 语法 fs.readTextSync(filePath: string, options?: Object): string ``` - **参数说明**: - `filePath`: 文件绝对路径(必须) - `options` (可选): - `encoding`: 编码格式(默认`'utf-8'`) - `offset`: 读取起始位置(字节) - `length`: 读取长度(字节) - **返回值**: 文件内容字符串 --- ### 完整使用示例 ```typescript import fs from '@ohos.file.fs'; import common from '@ohos.app.ability.common'; // 1. 获取应用沙箱路径 const context = getContext(this) as common.UIAbilityContext; const sandboxDir = context.filesDir; // 应用文件目录 const filePath = sandboxDir + '/config.json'; // 2. 写入测试文件(可选) fs.writeTextSync(filePath, '{"language":"zh-CN","theme":"dark"}'); // 3. 同步读取文本内容 try { const fileContent: string = fs.readTextSync(filePath, { encoding: 'utf-8', // 显式指定编码 offset: 0, // 从文件头开始 length: 1024 // 最大读取长度 }); console.log('File content:', fileContent); // 4. 解析JSON数据(典型场景) const config = JSON.parse(fileContent); console.log('Theme mode:', config.theme); // 输出: dark } catch (err) { console.error('读取失败:', JSON.stringify(err)); } ``` --- ### 关键注意事项 1. **沙箱路径获取**: - 缓存目录: `context.cacheDir + '/filename'` - 文件目录: `context.filesDir + '/filename'` - 临时目录: `context.tempDir + '/filename'` [^4] 2. **异常处理**: - 文件不存在时抛出`ENOENT`错误 - 路径无权限时抛出`EACCES`错误 - 必须使用`try/catch`捕获异常 3. **性能建议**: - 大文件推荐使用`read`异步接口 - 配置文件等小文件(<100KB)适用同步读取 --- ### 典型应用场景 1. **读取配置文件** ```typescript // 读取用户设置 const settingsPath = context.filesDir + '/user_settings.json'; const settings = JSON.parse(fs.readTextSync(settingsPath)); ``` 2. **加载本地缓存数据** ```typescript // 引用[4]的缓存读取示例 getCacheData(key: string) { const cacheFile = context.cacheDir + '/ComputeResult.txt'; const data = fs.readTextSync(cacheFile); return JSON.parse(data)[key]; } ``` 3. **解析资源文件** ```typescript // 读取rawfile中的文本资源 const resourcePath = $r('app.rawfile.welcome_text').split('://')[1]; const welcomeText = fs.readTextSync(resourcePath); ``` [^1]: 鸿蒙系统文件操作需遵循沙箱安全规则 [^4]: 缓存目录路径获取方式 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

auhgnixgnahz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值