HarmonyOS 5.0应用开发——UIAbility生命周期

打印 上一主题 下一主题

主题 977|帖子 977|积分 2931

【高心星出品】
     UIAbility组件

     UIAbility组件是一种包含UI的应用组件,主要用于和用户交互。
     UIAbility组件是体系调度的根本单元,为应用提供绘制界面的窗口。一个应用可以包含一个或多个UIAbility组件。例如,在支付应用中,可以将入口功能和收付款功能分别设置为独立的UIAbility。
     每一个UIAbility组件实例都会在最近任务列表中显示一个对应的任务。
     对于开发者而言,可以根据具体场景选择单个还是多个UIAbility,划分发起如下:
     

  • 如果开发者希望在任务视图中看到一个任务,发起使用“一个UIAbility+多个页面”的方式,可以避免不必要的资源加载。
  • 如果开发者希望在任务视图中看到多个任务,或者需要同时开启多个窗口,发起使用多个UIAbility实现差异的功能。
    例如,即时通讯类应用中的消息列表与音视频通话采取差异的UIAbility举行开发,既可以方便地切换任务窗口,又可以实现应用的两个任务窗口在一个屏幕上分屏显示。
     创建Ability

     

     查看ability在module.json5的设置:
                                   登录后复制                        
  1. {
  2.   "module": {
  3.     // ...
  4.     "abilities": [
  5.       {
  6.         "name": "EntryAbility", // UIAbility组件的名称
  7.         "srcEntry": "./ets/entryability/EntryAbility.ets", // UIAbility组件的代码路径
  8.         "description": "$string:EntryAbility_desc", // UIAbility组件的描述信息
  9.         "icon": "$media:icon", // UIAbility组件的图标
  10.         "label": "$string:EntryAbility_label", // UIAbility组件的标签
  11.         "startWindowIcon": "$media:icon", // UIAbility组件启动页面图标资源文件的索引
  12.         "startWindowBackground": "$color:start_window_background", // UIAbility组件启动页面背景颜色资源文件的索引
  13.         // ...
  14.       }
  15.     ]
  16.   }
  17. }
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
                       UIAbility的生命周期

     当用户打开、切换和返回到对应应用时,应用中的UIAbility实例会在其生命周期的差异状态之间转换。UIAbility类提供了一系列回调,通过这些回调可以知道当前UIAbility实例的某个状态发生改变,会颠末UIAbility实例的创建和烧毁,或者UIAbility实例发生了前后台的状态切换。
     

     Create状态

     Create状态为在应用加载过程中,UIAbility实例创建完成时触发,体系会调用onCreate()回调。可以在该回调中举行页面初始化操纵,例如变量定义资源加载等,用于后续的UI展示。
                                   登录后复制                        
  1. onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  2.   hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  3.   // 获取跳转ability携带的数据
  4.   let params=want.parameters
  5.   let name=params!.name
  6. }
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
                       WindowStageCreate状态

     UIAbility实例创建完成之后,在进入Foreground之前,体系会创建一个WindowStage。WindowStage创建完成后会进入onWindowStageCreate()回调,可以在该回调中设置UI加载、设置WindowStage的事件订阅。
     在onWindowStageCreate()回调中通过loadContent()方法设置应用要加载的页面,并根据需要调用on('windowStageEvent')方法订阅WindowStage的事件(获焦/失焦、切到前台/切到后台、前台可交互/前台不可交互)。
                                   登录后复制                        
  1. onWindowStageCreate(windowStage: window.WindowStage): void {
  2.   // Main window is created, set main page for this ability
  3.   hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
  4.   // 监听状态状态
  5.   windowStage.on('windowStageEvent',(event)=>{
  6.     switch (event){
  7.       case window.WindowStageEventType.SHOWN:
  8.         console.info('gxxt ','切换到前台')
  9.       break;
  10.       case window.WindowStageEventType.SHOWN:
  11.         console.info('gxxt ','切换到前台')
  12.         break;
  13.       case window.WindowStageEventType.ACTIVE:
  14.         console.info('gxxt ','获得焦点')
  15.         break;
  16.       case window.WindowStageEventType.INACTIVE:
  17.         console.info('gxxt ','失去焦点')
  18.         break;
  19.       case window.WindowStageEventType.RESUMED:
  20.         console.info('gxxt ','可以交互')
  21.         break; case window.WindowStageEventType.PAUSED:
  22.       console.info('gxxt ','卡顿不可交互')
  23.       break;
  24.       case window.WindowStageEventType.HIDDEN:
  25.         console.info('gxxt ','切换到后台')
  26.         break;
  27.     }
  28.   })
  29.   // 加载页面
  30.   windowStage.loadContent('pages/Index', (err) => {
  31.     if (err.code) {
  32.       hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
  33.       return;
  34.     }
  35.     hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');
  36.   });
  37. }
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
                       Foreground和Background状态

     Foreground和Background状态分别在UIAbility实例切换至前台和切换至后台时触发,对应于onForeground()回调和onBackground()回调。
     onForeground()回调,在UIAbility的UI可见之前,如UIAbility切换至前台时触发。可以在onForeground()回调中申请体系需要的资源,或者重新申请在onBackground()中释放的资源。
     onBackground()回调,在UIAbility的UI完全不可见之后,如UIAbility切换至后台时候触发。可以在onBackground()回调中释放UI不可见时无用的资源,或者在此回调中实行较为耗时的操纵,例如状态生存等。
     例如应用在使用过程中需要使用用户定位时,假设应用已得到用户的定位权限授权。在UI显示之前,可以在onForeground()回调中开启定位功能,从而获取到当前的位置信息。
     当应用切换到后台状态,可以在onBackground()回调中制止定位功能,以节流体系的资源斲丧。
                                   登录后复制                        
  1. onForeground(): void {
  2.   // Ability has brought to foreground
  3.   hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  4. }
  5. onBackground(): void {
  6.   // Ability has back to background
  7.   hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  8. }
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
                       WindowStageWillDestroy状态

     onWindowStageWillDestroy()回调在WindowStage烧毁前实行,此时WindowStage可以使用。
                                   登录后复制                        
  1. onWindowStageWillDestroy(windowStage: window.WindowStage): void {
  2. //  关闭窗口事件监听
  3. windowStage.off('windowStageEvent')
  4. }
复制代码
      

  • 1.
  • 2.
  • 3.
  • 4.
                       Destroy状态

     Destroy状态在UIAbility实例烧毁时触发。可以在onDestroy()回调中举行体系资源的释放、数据的生存等操纵。
     例如,调用terminateSelf()方法制止当前UIAbility实例,实行onDestroy()回调,并完成UIAbility实例的烧毁。
                                   登录后复制                        
  1. onDestroy(): void {
  2.   hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  3. }
复制代码
      

  • 1.
  • 2.
  • 3.

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

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

盛世宏图

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表