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

打印 上一主题 下一主题

主题 1018|帖子 1018|积分 3054

基本概念

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的四个回调函数
  1. export default class MyAbilityStage extends AbilityStage {
  2.     onCreate() {
  3.         //HAP在首次加载的时候执行,可以在此函数中为该Module做初始化操作。
  4.         ...
  5.     }
  6.     onAcceptWant(want:Want) {
  7.         //UIAbility组件指定实例启动模式下触发,返回的字符串为UIAbility实例的唯一标识。
  8.         ...
  9.         return 'specifiedUIAbilityInstanceKey';
  10.     }
  11. }
复制代码
定义好类之后,我们必要配置HAP加载入口
  1. // module.json5
  2. {
  3.     "module":{
  4.        "name":"entry",
  5.        "type":"entry",
  6.        "srcEntry":"./ets/myabilitystage/MyAbilityStage.ets",
  7.        ...
  8.     }
  9. }
复制代码
UIAbility组件启动模式



  • 单实例启动模式(singleton):该启动模式为默认启动模式,体系运行时,同一UIAbility组件只存在唯一实例。
  • 多实例启动模式(multiton):体系每次启动UIAbility组件,都会创建一个新的该范例UIAbility实例。(即在任务视图中可以看到有多个该范例的任务)
  • 指定实例启动模式(specified):支持拉起指定key值的UIAbility实例。体系每次拉起指定key值的UIAbility实例,若key值不存在,则创建一个新的实例。
配置如下:
  1. // module.json5
  2. {
  3.    "module":{
  4.       ...
  5.       "abilities": {
  6.           ...
  7.           launchType:"singleton"  
  8.       }
  9.    }
  10. }
复制代码
Want

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

显式Want启动UIAbility组件开发

  1. //调用方页面
  2. // 获取UIAbilityContext
  3. let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
  4. //创建Want。指定应用包名和Ability名
  5. let want: Want = {
  6.     deviceId: '',  //指定拉起的应用所在设备,deviceId为空表示本设备
  7.     bundleName: 'com.example.myapplication', //指定拉起的应用包名
  8.     abilityName: 'FuncAbility',  //指定拉起的Ability名
  9.     moduleName: 'func',   //指定拉起的Ability内的模块名
  10.     parameters: {   //自定义信息
  11.         info: '来自EntryAbility Index页面'
  12.     }
  13.   }
  14.   
  15. //根据Want拉起对应Ability,
  16. //调用启动函数,传入Want参数
  17. context.startAbility(want).then(()=>{
  18.     //启动成功
  19. }).catch((err: BusinessError)=>{
  20.     //启动失败
  21. })
  22.    
  23. //被调用方UIAbility文件
  24. //接收want,获取调用方信息
  25. export default class FuncAbility extends UIAbility {
  26.     ...
  27.     onCreate(want: Want) {
  28.         //接受调用方UIAbility传过来的参数
  29.         let info = want.parameters?.info;
  30.         ...
  31.     }
  32. }
复制代码
隐式Want启动UIAbility组件开发

  1. //设置被调用方的module.json5
  2. {
  3.     "module":{
  4.         "abilities": [
  5.             {
  6.                ...
  7.                "skills": [
  8.                 {
  9.                    //设置UIAbility支持的能力类型,如浏览器类型
  10.                    "entities": [
  11.                        ...
  12.                        "entity.system.browsable"
  13.                    ],
  14.                    //设置UIAbility支持的操作,如查看数据
  15.                    "actions":[
  16.                        ...
  17.                        "ohos.want.action.viewData"
  18.                    ]
  19.                    ...
  20.                 }
  21.                ]
  22.             }
  23.         ]
  24.     }
  25. }
  26. //调用方页面
  27. //获取UIAbilityContext
  28. let context:common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
  29. //创建Want,设置action和entities匹配条件。在Want中不指定abilityName字段,而是指定一系列筛选条件
  30. let want:Want = {
  31.     action: 'ohos.want.action.viewData',
  32.     entities: ['entity.system.browsable'],
  33.     url: 'https://www.huawei.com/cn/'
  34. }
  35. //拉起UIAbility
  36. //调用启动函数,传入Want参数
  37. context.startAbility(want).then(()=>{
  38.     //启动成功
  39. }).catch((err: BusinessError)=>{
  40.     //启动失败
  41. })
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

慢吞云雾缓吐愁

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表