慢吞云雾缓吐愁 发表于 2024-11-20 08:29:43

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

基本概念

UIAbility组件是一种包罗UI的应用组件,主要用于和用户交互。
在项目创建时,体系默认生成的EntryAbility类继续了UIAbility类。
https://i-blog.csdnimg.cn/direct/5722fbf052794afb8a67c9b309dfac01.png
ExtensionAbility组件:是基于特定场景(比方服务卡片、输入法等)提供的应用组件。每一个详细场景对应一个ExtensionAbilityType,开发者只能利用体系已定义的范例。
在这里可以直接创建差异范例的ExtensionAbility组件文件
https://i-blog.csdnimg.cn/direct/b159d22ed6bd4cdaaaa2e1037de66797.png
HAP:应用安装的基本单位,一个APP可以包罗一个或多个HAP。
包罗UIAbility组件或者ExtensionAbility组件的Module可以单独运行。该范例Module运行时会编译生成一个.hap文件
AbilityStage:Module级别的组件容器。
当HAP中的代码首次被加载到历程中时(Module初始化),体系起首会创建一个AbilityStage实例,可以管理Module中的UIAbility组件和ExtensionAbility组件。
https://i-blog.csdnimg.cn/direct/1bae1d240e354fd0b72964fb58a25389.png
AbilityStage与编译期的HAP是逐一对应的关系
在开发时,一个项目可能必要包罗一个或者多个可以单独运行的Module,对应即为一个Application包罗一个或多个AbilityStage。
在运行期,每个AbilityStage持有该Module上定义的UIAbility组件和ExtensionAbility组件。AbilityStage与Module逐一对应,即一个Module拥有一个AbilityStage。
当UIAbility组件首次启动时,体系会为UIAbility组件创建实例,并将该实例与持有它的AbilityStage实例相干联。

应用组件与窗口生命周期



[*] 业务逻辑和UI逻辑分离
[*] 便于体系对应用组件进行裁剪(无屏装备可裁剪窗口)
[*] 在多装备(如桌面装备和移动装备)上,应用组件可利用同一套生命周期
https://i-blog.csdnimg.cn/direct/32b81af1fe92484b8e3d23284ee33930.png
在UIAbility的onCreate()的生命周期回调函数中,我们可以在该函数中初始化业务逻辑,比方变量定义,资源预加载等,用于后续的UI展示。
在这张图中,我们可以看到应用组价和窗口的生命周期是松耦合的,这种模式有如下好处:


[*] 业务逻辑和UI逻辑分离,可以在UIAbility组件中处理与页面无关的业务逻辑。在WindowStage持有的窗口上通过ArkUI处理界面相干的业务逻辑。
[*] 便于体系对应用组件进行裁剪,比方对于无屏装备,体系在运行应用时不会创建窗口模块,有利于减少体系ROM空间占用。
[*] 在多装备如桌面装备和移动装备上,应用组件可利用同一套生命周期,应用运行时,体系会自动判定装备,并根据差异装备的窗口形态变更,执行差异的生命周期变化流程。
在差异装备上任务切换场景组件生命周期变化举例。
https://i-blog.csdnimg.cn/direct/bde3e07a9291467e8360b18ae11c1edc.png
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是对象间信息传递的载体,用于在应用组件之间传递信息
https://i-blog.csdnimg.cn/direct/7768ffc9ffdd451e8d5b0d0065372457.png
显式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)=>{
    //启动失败
})

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【HarmonyOS学习日记(8)】UIAbility,HAP,AbilityStage组件及其生命周期