HarmonyOS4.0系统性深入开发14AbilityStage组件容器
AbilityStage组件容器
AbilityStage是一个Module级别的组件容器,应用的HAP在首次加载时会创建一个AbilityStage实例,可以对该Module进行初始化等操作。
AbilityStage与Module一一对应,即一个Module拥有一个AbilityStage。
DevEco Studio默认工程中未自动生成AbilityStage,如需要使用AbilityStage的能力,可以手动新建一个AbilityStage文件,具体步骤如下。
-
在工程Module对应的ets目录下,右键选择“New > Directory”,新建一个目录并命名为myabilitystage。
-
在myabilitystage目录,右键选择“New > TypeScript File”,新建一个TypeScript文件并命名为MyAbilityStage.ts。
-
打开MyAbilityStage.ts文件,导入AbilityStage的依赖包,自定义类继承AbilityStage并加上需要的生命周期回调,示例中增加了一个onCreate()生命周期回调。
import AbilityStage from '@ohos.app.ability.AbilityStage';export default class MyAbilityStage extends AbilityStage {onCreate() {// 应用的HAP在首次加载的时,为该Module初始化操作}onAcceptWant(want) {// 仅specified模式下触发return "MyAbilityStage";} }
-
在module.json5配置文件中,通过配置srcEntry参数来指定模块对应的代码路径,以作为HAP加载的入口。
{"module": {"name": "entry","type": "entry","srcEntry": "./ets/myabilitystage/MyAbilityStage.ts",...} }
AbilityStage拥有onCreate()生命周期回调和onAcceptWant()、onConfigurationUpdated()、onMemoryLevel()事件回调。
- onCreate()生命周期回调:在开始加载对应Module的第一个UIAbility实例之前会先创建AbilityStage,并在AbilityStage创建完成之后执行其onCreate()生命周期回调。AbilityStage模块提供在Module加载的时候,通知开发者,可以在此进行该Module的初始化(如资源预加载,线程创建等)能力。
- onAcceptWant()事件回调:UIAbility指定实例模式(specified)启动时候触发的事件回调,具体使用请参见UIAbility启动模式综述。
- onConfigurationUpdated()事件回调:当系统全局配置发生变更时触发的事件,系统语言、深浅色等,配置项目前均定义在Configuration类中。
- onMemoryLevel()事件回调:当系统调整内存时触发的事件。
应用被切换到后台时,系统会将在后台的应用保留在缓存中。即使应用处于缓存中,也会影响系统整体性能。当系统资源不足时,系统会通过多种方式从应用中回收内存,必要时会完全停止应用,从而释放内存用于执行关键任务。为了进一步保持系统内存的平衡,避免系统停止用户的应用进程,可以在AbilityStage中的onMemoryLevel()生命周期回调中订阅系统内存的变化情况,释放不必要的资源。
import AbilityStage from '@ohos.app.ability.AbilityStage';export default class MyAbilityStage extends AbilityStage {onMemoryLevel(level) {// 根据系统可用内存的变化情况,释放不必要的内存}
}
应用上下文Context
概述
Context是应用中对象的上下文,其提供了应用的一些基础信息,例如resourceManager(资源管理)、applicationInfo(当前应用信息)、dir(应用开发路径)、area(文件分区)等,以及应用的一些基本方法,例如createBundleContext()、getApplicationContext()等。UIAbility组件和各种ExtensionAbility派生类组件都有各自不同的Context类。分别有基类Context、ApplicationContext、AbilityStageContext、UIAbilityContext、ExtensionContext、ServiceExtensionContext等Context。
-
各类Context的继承关系
-
各类Context的持有关系
-
各类Context的获取方式
-
获取UIAbilityContext。每个UIAbility中都包含了一个Context属性,提供操作Ability、获取Ability的配置信息、应用向用户申请授权等能力。
import UIAbility from '@ohos.app.ability.UIAbility'; export default class EntryAbility extends UIAbility {onCreate(want, launchParam) {let uiAbilityContext = 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的基础上提供了订阅应用内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();// ...} }
-
Context的典型使用场景
本章节通过如下典型场景来介绍Context的用法:
- 获取应用文件路径
- 获取和修改加密分区
- 创建其他应用或其他Module的Context
- 订阅进程内Ability生命周期变化
获取应用文件路径
基类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/ -
通过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';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;// ...}
}
获取和修改加密分区
上一个场景中,引入了加密等级的概念,通过对Context的area属性的读写来实现获取和设置当前加密分区,支持如下两种加密等级:
- 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) { // 获取areathis.context.area = 0; // 修改area}// 存储普通信息// 存储敏感信息前,切换到EL2用户级加密if (this.context.area === 0) { // 获取areathis.context.area = 1; // 修改area}// 存储敏感信息}
}
创建其他应用或其他Module的Context
基类Context提供创建其他应用或其他Module的Context的方法为createModuleContext(moduleName:string),创建其他应用或者其他Module的Context,从而通过该Context获取相应的资源信息(例如获取其他Module的获取应用开发路径信息)。
调用createModuleContext(moduleName:string)方法,获取本应用中其他Module的Context。获取到其他Module的Context之后,即可获取到相应Module的资源信息。
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);// ...}
}
订阅进程内Ability生命周期变化
在应用内的DFX统计场景,如需要统计对应页面停留时间和访问频率等信息,可以使用订阅进程内Ability生命周期变化功能。
在进程内Ability生命周期变化时,如创建、可见/不可见、获焦/失焦、销毁等,会触发进入相应的回调,其中返回的此次注册监听生命周期的ID(每次注册该ID会自增+1,当超过监听上限数量2^63-1时,返回-1),以在UIAbilityContext中使用为例进行说明。
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属性获取applicationContextlet 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));});}
}
相关文章:

HarmonyOS4.0系统性深入开发14AbilityStage组件容器
AbilityStage组件容器 AbilityStage是一个Module级别的组件容器,应用的HAP在首次加载时会创建一个AbilityStage实例,可以对该Module进行初始化等操作。 AbilityStage与Module一一对应,即一个Module拥有一个AbilityStage。 DevEco Studio默…...

客服系统接入FastGPT
接入FastGPT 点击【应用】【外部使用】【API访问】【新建】新建一个KEY,同时也可以看到我们的API根地址 这个根地址和Key可以填入任何支持OpenAI接口的应用里,这个接口是兼容OpenAI格式。 在客服系统【知识库AI配置】里填上接口地址和接口密钥。这样我…...

Hi5 2.0 虚拟手与追踪器(Tracker)的位置修正
问题描述 使用环境与工具:Unity 2022.3.4fc1,steam VR(2.7.3),steamvrSDK(1.14.15),HTC vive pro专业版,Hi5 2.0数据手套 首先按照Hi5 2.0的使用说明(可参考:HI5 2.0 交…...

广播及代码实现
广播(Broadcast)是一种网络通信方式,它允许一台设备向网络中的所有其他设备发送消息。广播通常用于在网络上传递一些信息,让所有设备都能接收并处理。在广播中,通信的目标是整个网络而不是特定的单个设备。 向子网中…...

QT应用篇 三、QML自定义显示SpinBox的加减按键图片及显示值效果
QT应用篇 一、QT上位机串口编程 二、QML用Image组件实现Progress Bar 的效果 三、QML自定义显示SpinBox的加减按键图片及显示值效果 文章目录 QT应用篇前言一、qml需求二、使用组件1.SpinBox组件2.SpinBox中QML的使用 总结 前言 记录自己学习QML的一些小技巧方便日后查找 QT的…...
2022年全国职业院校技能大赛网络安全竞赛试题1-10-B模块总结
前言 结尾有对22年国赛题型总结 试题1模块B 网络安全事件响应、数字取证调查和应用安全 B-1任务一:主机发现与信息收集 *任务说明:仅能获取Server1的IP地址 1.通过渗透机Kali2.0对靶机场景进行TCP同步扫描 (使用Nmap工具),并将该操作使用…...

20231228在Firefly的AIO-3399J开发板的Android11的Firefly的AIO-3399J开发板的DTS配置单前置摄像头ov13850
20231228在Firefly的AIO-3399J开发板的Android11的Firefly的AIO-3399J开发板的DTS配置单前置摄像头ov13850 2023/12/28 12:30 开发板:Firefly的AIO-3399J【RK3399】 SDK:rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBr…...

php-fpm运行一段时间,内存不足
目录 一:原因分析 二:解决 三:观察系统情况 php-fpm运行一段时间,内存不足,是什么原因呢。 一:原因分析 1:首先php-fpm的配置 (1)启动的进程数 启动的进程数越多,占用内存越高; 2:其次…...

基于轻量级GhostNet模型开发构建生活场景下生活垃圾图像识别系统
轻量级识别模型在我们前面的博文中已经有过很多实践了,感兴趣的话可以自行移步阅读: 《移动端轻量级模型开发谁更胜一筹,efficientnet、mobilenetv2、mobilenetv3、ghostnet、mnasnet、shufflenetv2驾驶危险行为识别模型对比开发测试》 《基…...

《Linux系列》Linux磁盘MBR分区扩容
文章目录 Linux磁盘MBR分区扩容1.前言2.控制台磁盘扩容3.分区扩容3.1 fdisk3.2 lsblk3.3 扩容分区 4.扩容文件系统4.1 df4.2 扩容文件系统 Linux磁盘MBR分区扩容 1)参考阿里云扩容分区文档,整理MBR分区扩容 2)本文档适用于MBR分区(fdisk -lu查…...

IPv6地址配置
IPv6地址接口配置 IPv6地址结构 一个IPv6地址可以分为两部分: 网络前缀:n比特,相当于IPv4地址中的网络ID 接口标识:128-n比特,相当于IPv4地址中的主机ID 注意: 对于IPv6单播地址来说,如果地址的前三bit不是000,则接口标识必须为64位,如果地址的前三位是000,则没有此…...
Ubuntu20.04 防火墙配置
ubuntu 系统中配置防火墙 ufw(Uncomplicated Firewall)是一个简化的、易于使用的Linux防火墙工具,旨在方便用户管理iptables防火墙规则。 特点 简化的防火墙管理:ufw提供了一个简洁的命令行界面,让您能够轻松地添加、…...

Windows上ModbusTCP模拟Master与Slave工具的使用
场景 Modbus Slave 与 Modbus Poll主从设备模拟软件与Configure Virtual Serial串口模拟软件使用: Modebus Slave 与 Modbus Poll主从设备模拟软件与Configure Virtual Serial串口模拟软件使用_modbus poll激活-CSDN博客 数据对接协议为Modbus TCP,本地开发需要使…...

史上最细,13年老鸟总结-性能测试7大关键点,一篇打通...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、测试环境的鉴定…...
长虹智能电视ZLM60HiS机芯刷机方法及刷机固件,附进维修模式方法
适配机芯:ZLM60HiS 型号:Q1FU、D6000i、U3、D8000ID 软件强制升级方法: 1、下载后解压,找到upgrade_ZLM60HiS_MT5508_V1.00xxx_part.pkg 、chandroid_ota_ZLM60HiS_datapart.zip复制到U盘根目录(不要有任何文件夹&a…...

计算机网络【Google的TCP BBR拥塞控制算法深度解析】
Google的TCP BBR拥塞控制算法深度解析 宏观背景下的BBR 慢启动、拥塞避免、快速重传、快速恢复: 说实话,这些机制完美适应了1980年代的网络特征,低带宽,浅缓存队列,美好持续到了2000年代。 随后互联网大爆发&#x…...

lvs+keepalived+nginx实现四层负载+七层负载
目录 一、lvs配置 二、nginx配置 三、测试 3.1 keepalived负载均衡 3.2 lvskeepalived高可用 3.3 nginx高可用 主机IPlvs01-33 11.0.1.33 lvs02-3411.0.1.34nginx0111.0.1.31nginx0211.0.1.32VIP11.0.1.30 4台主机主机添加host [rootnginx01 sbin]# cat /etc/hosts 127.0.0.…...

独立看门狗与窗口看门狗
一、简介 STM32F10xxx内置两个看门狗,提供了更高的安全性、时间的精确性和使用的灵活性。两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产…...
【CTF杂项】常见文件文件头文件尾格式总结 各类文件头
常见文件文件头文件尾格式总结及各类文件头 以下是常见文件的文件头格式总结及各类文件头的描述: 图像文件: JPEG:文件头格式为FF D8 FF,文件尾格式为FF D9。PNG:文件头格式为89 50 4E 47 0D 0A 1A 0A,文件…...
深度学习-模型转换_所需算力相关
模型转换相关 tensflow转onnx python -m tf2onnx.convert \--graphdef /root/autodl-tmp/warren/text-detection-ctpn/data/ctpn.pb \--output ./model.onnx --inputs Placeholder:0 --outputs Reshape_2:0,rpn_bbox_pred/Reshape_1:0 pytorch转onnx #!/usr/…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...

Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...