【HarmonyOS学习日志(8)】UIAbility,HAP,AbilityStage组件及其生命周期

news2024/11/16 4:53:51

基本概念

UIAbility组件是一种包含UI的应用组件,主要用于和用户交互。

在项目创建时,系统默认生成的EntryAbility类继承了UIAbility类。

ExtensionAbility组件:是基于特定场景(例如服务卡片、输入法等)提供的应用组件。每一个具体场景对应一个ExtensionAbilityType,开发者只能使用系统已定义的类型。

在这里可以直接创建不同类型的ExtensionAbility组件文件

HAP:应用安装的基本单位,一个APP可以包含一个或多个HAP。

包含UIAbility组件或者ExtensionAbility组件的Module可以单独运行。该类型Module运行时会编译生成一个.hap文件

AbilityStage:Module级别的组件容器。

当HAP中的代码首次被加载到进程中时(Module初始化),系统首先会创建一个AbilityStage实例,可以管理Module中的UIAbility组件和ExtensionAbility组件。

AbilityStage与编译期的HAP是一一对应的关系

在开发时,一个项目可能需要包含一个或者多个可以单独运行的Module,对应即为一个Application包含一个或多个AbilityStage。

在运行期,每个AbilityStage持有该Module上定义的UIAbility组件和ExtensionAbility组件。AbilityStage与Module一一对应,即一个Module拥有一个AbilityStage。

当UIAbility组件首次启动时,系统会为UIAbility组件创建实例,并将该实例与持有它的AbilityStage实例相关联。

应用组件与窗口生命周期

  • 业务逻辑和UI逻辑分离

  • 便于系统对应用组件进行裁剪(无屏设备可裁剪窗口)

  • 在多设备(如桌面设备和移动设备)上,应用组件可使用同一套生命周期

在UIAbility的onCreate()的生命周期回调函数中,我们可以在该函数中初始化业务逻辑,例如变量定义,资源预加载等,用于后续的UI展示。

在这张图中,我们可以看到应用组价和窗口的生命周期是松耦合的,这种模式有如下好处:

  • 业务逻辑和UI逻辑分离,可以在UIAbility组件中处理与页面无关的业务逻辑。在WindowStage持有的窗口上通过ArkUI处理界面相关的业务逻辑。

  • 便于系统对应用组件进行裁剪,例如对于无屏设备,系统在运行应用时不会创建窗口模块,有利于减少系统ROM空间占用。

  • 在多设备如桌面设备和移动设备上,应用组件可使用同一套生命周期,应用运行时,系统会自动判断设备,并根据不同设备的窗口形态变换,执行不同的生命周期变化流程。

在不同设备上任务切换场景组件生命周期变化举例。

AbilityStage组件容器

AbilityStage是Module级别的组件容器,HAP的运行期类。

生命周期回调函数:

  • onCreate():AbilityStage实例创建完成之后触发的回调函数。

  • onAcceptWant():指定实例模式的UIAbility组件启动时触发的回调函数。

  • onConfigurationUpdated():系统发生全局配置变化时的回调函数。

  • onMemoryLevel():系统决定调整内存时的回调函数。

如果需要使用AbilityStage的能力,我们需要新建目录和文件,并自定义继承AbilityStage的类。

可以根据需要重写AbilityStage的四个回调函数

export default class MyAbilityStage extends AbilityStage {
    onCreate() {
        //HAP在首次加载的时候执行,可以在此函数中为该Module做初始化操作。
        ...
    }
    onAcceptWant(want:Want) {
        //UIAbility组件指定实例启动模式下触发,返回的字符串为UIAbility实例的唯一标识。
        ...
        return 'specifiedUIAbilityInstanceKey';
    }
}

定义好类之后,我们需要配置HAP加载入口

// module.json5
{
    "module":{
       "name":"entry",
       "type":"entry",
       "srcEntry":"./ets/myabilitystage/MyAbilityStage.ets",
       ...
    }
}

UIAbility组件启动模式

  • 单实例启动模式(singleton):该启动模式为默认启动模式,系统运行时,同一UIAbility组件只存在唯一实例。

  • 多实例启动模式(multiton):系统每次启动UIAbility组件,都会创建一个新的该类型UIAbility实例。(即在任务视图中可以看到有多个该类型的任务)

  • 指定实例启动模式(specified):支持拉起指定key值的UIAbility实例。系统每次拉起指定key值的UIAbility实例,若key值不存在,则创建一个新的实例。

配置如下:

// module.json5
 {
   "module":{
      ...
      "abilities": {
          ...
          launchType:"singleton"  
      }
   }
}

Want

UIAbility组件间交互载体:Want

Want是对象间信息传递的载体,用于在应用组件之间传递信息

显式Want启动UIAbility组件开发
//调用方页面

// 获取UIAbilityContext
let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;

//创建Want。指定应用包名和Ability名
let want: Want = {
    deviceId: '',  //指定拉起的应用所在设备,deviceId为空表示本设备
    bundleName: 'com.example.myapplication', //指定拉起的应用包名
    abilityName: 'FuncAbility',  //指定拉起的Ability名
    moduleName: 'func',   //指定拉起的Ability内的模块名
    parameters: {   //自定义信息
        info: '来自EntryAbility Index页面'
    }
  }
  
//根据Want拉起对应Ability,
//调用启动函数,传入Want参数
context.startAbility(want).then(()=>{
    //启动成功
}).catch((err: BusinessError)=>{
    //启动失败
})
    
//被调用方UIAbility文件
//接收want,获取调用方信息
export default class FuncAbility extends UIAbility {
    ...
    onCreate(want: Want) {
        //接受调用方UIAbility传过来的参数
        let info = want.parameters?.info;
        ...
    }
}
隐式Want启动UIAbility组件开发
//设置被调用方的module.json5
{
    "module":{
        "abilities": [
            {
               ...
               "skills": [
                {
                   //设置UIAbility支持的能力类型,如浏览器类型
                   "entities": [
                       ...
                       "entity.system.browsable"
                   ],
                   //设置UIAbility支持的操作,如查看数据
                   "actions":[
                       ...
                       "ohos.want.action.viewData"
                   ]
                   ...
                }
               ]
            }
        ]
    }
}

//调用方页面
//获取UIAbilityContext
let context:common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
//创建Want,设置action和entities匹配条件。在Want中不指定abilityName字段,而是指定一系列筛选条件
let want:Want = {
    action: 'ohos.want.action.viewData',
    entities: ['entity.system.browsable'],
    url: 'https://www.huawei.com/cn/'
}
//拉起UIAbility
//调用启动函数,传入Want参数
context.startAbility(want).then(()=>{
    //启动成功
}).catch((err: BusinessError)=>{
    //启动失败
})

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】多线程(中)

目录 一、线程互斥 1.1 互斥概念 1.2 互斥量mutex 1.3 互斥量相关API (1)初始化互斥量 (2)销毁互斥量 (3)互斥量加锁和解锁 1.4 互斥量原理 1.5 重入和线程安全 二、死锁 2.1 概念 2.2 造成死锁…

【数字图像处理+MATLAB】基于 Sobel 算子计算图像梯度并进行边缘增强:使用 imgradientxy 函数

引言 在图像处理中,边缘通常是图像中像素强度变化最大的地方,这种变化可以通过计算图像的梯度来量化。梯度是一个向量,它的方向指向像素强度增加最快的方向,它的大小(或者说幅度)表示像素强度增加的速度。…

Nuxt.js 应用中的 schema:beforeWrite 事件钩子详解

title: Nuxt.js 应用中的 schema:beforeWrite 事件钩子详解 date: 2024/11/14 updated: 2024/11/14 author: cmdragon excerpt: schema:beforeWrite 钩子是 Vite 提供的一个功能强大的生命周期钩子,允许开发者在 JSON Schema 被写入之前执行自定义操作。利用这个钩子,您可以…

k8s服务内容滚动升级以及常用命令介绍

查看K8S集群所有的节点信息 kubectl get nodes 删除K8S集群中某个特定节点 kubectl delete nodes/10.0.0.123 获取K8S集群命名空间 kubectl get namespace 获取K8S所有命名空间的那些部署 kubectl get deployment --all-namespaces 创建命名空间 web界面上看到的效果,但是…

MinIo在Ubantu和Java中的整合

1.MinIo在Ubantu中的部署 首先准备好一台已经安装好Ubantu系统的服务器 MinIO是一个开源的对象存储服务器,兼容Amazon S3,性能卓越,适合存储非结构化数据,例如照片、视频、日志文件、备份和容器镜像等。 1:更新系统…

设计模式-参考的雷丰阳老师直播课

一般开发中使用的模式为模版模式策略模式组合,模版用来定义骨架,策略用来实现细节。 模版模式 策略模式 与模版模式特别像,模版模式会定义好步骤定义好框架,策略模式定义小细节 入口类 使用模版模式策略模式开发支付 以上使用…

【LeetCode】【算法】53. 最大子数组和

LeetCode 53. 最大子数组和 题目描述 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。 思路 思路:动态规划秒了 具体递推式如…

供应SW6301V单C口多协议升降压移动电源IC

1. 概述 SW6301V 是一款高集成度的单 C 口多协议升降压移动电源 SOC。集成双向升降压控制器,支持 2~6 节 电池串联,提供 100W 功 率 输 入 输 出 ; 支 持 C 口 快 充 输入输出 ; 支 持UFCS/PPS/PD/SVOOC/VOOC/SCP/FCP/QC/AFC/BC…

C++常用的新特性-->day06

时间间隔duration duration表示一段时间间隔&#xff0c;用来记录时间长度&#xff0c;可以表示几秒、几分钟、几个小时的时间间隔。duration的原型如下 // 定义于头文件 <chrono> template<class Rep,class Period std::ratio<1> > class duration;Rep&…

Cyberchef配合Wireshark提取并解析TCP/FTP流量数据包中的文件

前一篇文章中讲述了如何使用cyberchef提取HTTP/TLS数据包中的文件,详见《Cyberchef配合Wireshark提取并解析HTTP/TLS流量数据包中的文件》,链接这里,本文讲述下如何使用cyberchef提取FTP/TCP数据包中的文件。 FTP 是最为常见的文件传输协议,和HTTP协议不同的是FTP协议传输…

性能面向下一代PCIe Gen 5,G991B322HR、G99L12312HR 安费诺ExtremePort™ Swift连接器支持内部I/O应用

前言 为了在网络设备和服务器上提供更高速度和更小尺寸的解决方案&#xff0c;Amphenol开发了ExtremePort™ Swift连接器&#xff0c;适用于PCIe Gen5 NRZ 32GT/s、UPI 2.0 24GT/s、24Gb/s SAS信号。 G991B322HR G9912312HR G9912322HR G9914312HR G991B312HR G991C312HR G99…

IDEA调整警告级别【IntelliJ IDEA 2024.2.0.1】

文章目录 目前现状鼠标悬停&#xff0c;选择配置筛选 > 取消选择OK效果 目前现状 需要把提示改成只要显示error的5个 鼠标悬停&#xff0c;选择配置 筛选 > 取消选择 OK 效果

【二叉搜素树】——LeetCode二叉树问题集锦:6个实用题目和解题思路

文章目录 计算布尔二叉树的值求根节点到叶节点的数字之和二叉树剪枝验证二叉搜索树二叉搜索树中第K小的元素二叉树的所有路径 计算布尔二叉树的值 解题思路&#xff1a; 这是一个二叉树的布尔评估问题。树的每个节点包含一个值&#xff0c;其中叶子节点值为 0 或 1&#xff0…

windows下QT5.12.11使用MSVC编译器编译mysql驱动并使用详解

1、下载mysql开发库,后面驱动编译的时候需要引用到,下载地址:mysql开发库下载 2、使用everything搜索:msvc-version.conf,用记事本打开,添加:QMAKE_MSC_VER=1909。不然msvc下的mysql源码加载不上。

Isaac Sim+SKRL机器人并行强化学习

目录 Isaac Sim介绍 OmniIssacGymEnvs安装 SKRL安装与测试 基于UR5的机械臂Reach强化学习测评 机器人控制 OMNI GYM环境编写 SKRL运行文件 训练结果与速度对比 结果分析 运行体验与建议 Isaac Sim介绍 Isaac Sim是英伟达出的一款机器人仿真平台&#xff0c;适用于做机…

删库跑路,启动!

起因&#xff1a;这是一个悲伤的故事&#xff0c;在抓logcat时 device待机自动回根目录了&#xff0c;而题主对当前路径的印象还停留在文件夹下&#xff0c;不小心在根目录执行了rm -rf * … 所以&#xff0c;这是个悲伤的故事&#xff0c;东西全没了…device也黑屏了&#xff…

CSS的综合应用例子(网页制作)

这是html的一些最基本内容的代码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <t…

SobarQube实现PDF报告导出

文章目录 前言一、插件配置二、使用步骤1.新生成一个Token2.将拷贝的Token加到上文中执行的命令中3.查看报告 三、友情提示总结 前言 这篇博文是承接此文 .Net项目在Windows中使用sonarqube进行代码质量扫描的详细操作配置 描述如何导出PDF报告 众所周知&#xff0c;导出PDF功…

力扣-Mysql-3328-查找每个州的城市 II(中等)

一、题目来源 3328. 查找每个州的城市 II - 力扣&#xff08;LeetCode&#xff09; 二、数据表结构 表&#xff1a;cities ---------------------- | Column Name | Type | ---------------------- | state | varchar | | city | varchar | ----------------…

curl命令提交大json

有个客户需要提交一个4M左右的pdf&#xff0c;接口里传的是pdf字节流base64编码后的字符串。 直接curl -XPOST -d json串 api接口会报 参数过长报错Argument list too long 网上搜了下解决方案把json串放到文本里然后通过json.txt引入参数 这一试不要紧&#xff0c;差点儿导致…