页面和组件生命周期

864 阅读3分钟

一 UIAbility

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

  • 任务视图中看到一个任务,则建议使用一个UIAbility,多个页面的方式
  • 任务视图中看到多个任务,或者需要同时开启多个窗口,则建议使用多个UIAbility开发不同的模块功能

配置

在main下面的module.json5中,

  • name :UIAbility组件的名称
  • srcEntry:UIAbility组件的代码路径
  • description:组件的描述信息
  • icon 桌面上的icon
  • startWindowIcon 启动页面中间的icon
  • startWindowBackground 启动页面的背景颜色
"abilities": [
      {
        "name": "EntryAbility", // UIAbility组件的名称
        "srcEntry": "./ets/entryability/EntryAbility.ets", // UIAbility组件的代码路径
        "description": "$string:EntryAbility_desc", // UIAbility组件的描述信息
        "icon": "$media:icon", // UIAbility组件的图标
        "label": "$string:EntryAbility_label", // UIAbility组件的标签
        "startWindowIcon": "$media:icon", // UIAbility组件启动页面图标资源文件的索引
        "startWindowBackground": "$color:start_window_background", // UIAbility组件启动页面背景颜色资源文件的索引
      }
  ]

Ability

UIAbilityExtensionAbility的基类

  • onConfigurationUpdate 当系统配置更新时调用
  • onMemoryLevel 当内存到达不同级别时系统回调该方法。

Ability 生命周期

下面是一个UIAbility的例子场景

1000.webp

  • onCreate 应用创建,UIAbility实例创建完成时触发
  • onWindowStageCreate 主Window创建完成 windowStage.loadContent 加载第一个组件
  • onForeground 在前台
  • onBackground 应用退到后台
  • onWindowStageWillDestroy 即将被销毁
  • onWindowStageDestroy window销毁,释放UI资源,例如在onWindowStageDestroy()中注销获焦/失焦等WindowStage事件
  • onDestroy 应用销毁
  • onWindowStageRestore Window重新创建的时候

AbilityLifecycleCallback

AbilityLifecycleCallback可以监听UIAbility的生命周期

  • onAbilityCreate 注册监听应用上下文的生命周期后,在ability创建时触发回调。
  • onWindowStageCreate 在window创建时触发回调
  • onWindowStageActive 在window获焦时触发回调。
  • onWindowStageInactive 在window失去焦点
  • onWindowStageDestroy window销毁时
  • onAbilityDestroy ability销毁时
  • onAbilityForeground ability在前台
  • onAbilityBackground ability在后台
  • onAbilityContinue ability迁移时
export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
    // 1. 获取上下文
    let applicationContext = this.context.getApplicationContext();
    // 2.在onCreate 通过applicationContext注册监听应用内生命周期
    // 把下面存到一个单利map中
    let lifecycleId = applicationContext.on('abilityLifecycle', abilityLifecycleCallback);
    console.log(`registerAbilityLifecycleCallback lifecycleId: ${GlobalContext.getContext().getObject('lifecycleId')}`);
    // 3. 在 onDestroy 的时候要移除
    applicationContext.off('abilityLifecycle', lifecycleId, (error) => {
      if (error && error.code !== 0) {
        // 出错
      } else {
        // 成功
      }
    })
  }
--------------------------------------------------------------------
// 声明ability生命周期回调,需配置所有回调后才可以在applicationContext注册
let abilityLifecycleCallback: AbilityLifecycleCallback = {
  onAbilityCreate(ability){
    console.log('AbilityLifecycleCallback onAbilityCreate.');
  },
  onWindowStageCreate(ability, windowStage){
    console.log('AbilityLifecycleCallback onWindowStageCreate.');
  },
  onWindowStageActive(ability, windowStage){
    console.log('AbilityLifecycleCallback onWindowStageActive.');
  },
  onWindowStageInactive(ability, windowStage){
    console.log('AbilityLifecycleCallback onWindowStageInactive.');
  },
  onWindowStageDestroy(ability, windowStage){
    console.log('AbilityLifecycleCallback onWindowStageDestroy.');
  },
  onAbilityDestroy(ability){
    console.log('AbilityLifecycleCallback onAbilityDestroy.');
  },
  onAbilityForeground(ability){
    console.log('AbilityLifecycleCallback onAbilityForeground.');
  },
  onAbilityBackground(ability){
    console.log('AbilityLifecycleCallback onAbilityBackground.');
  },
  onAbilityContinue(ability){
    console.log('AbilityLifecycleCallback onAbilityContinue.');
  }
};

其他的先不考虑了,其他都是关于多 UIAbility

二 Entry装饰的组件生命周期,提供以下生命周期接口:

  • onPageShow 页面每次显示时触发一次,包括路由过程、应用进入前台等场景。相当于onReusme
  • onPageHide 页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。相当于onPause
  • onBackPress 当用户点击返回按钮时触发。

Component装饰的自定义组件的生命周期,提供以下生命周期接口:

  • aboutToAppear组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build()函数之前执行。
  • onWillApplyThemeonWillApplyTheme函数用于获取当前组件上下文的Theme对象,在创建自定义组件的新实例后,在执行其build()函数之前执行。允许在onWillApplyTheme函数中改变状态变量,更改将在后续执行build()函数中生效。
  • onDidBuild 组件build()函数执行完成之后回调该接口,不建议在onDidBuild函数中更改状态变量、使用animateTo等功能,这可能会导致不稳定的UI表现。
  • aboutToDisappear aboutToDisappear函数在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定,当if else 添加或移除的时候也会执行这里
  • aboutToReuse 当@Component 有 @Reusable 这个修饰的时候,证明可以服用,当第二次添加的时候,只会走这个方法,上面方法不会再走了

组件方法

getUIContext

getUIContext(): UIContext

获取UIContext对象。

getUniqueId

getUniqueId(): number

获取当前Component的UniqueId。UniqueId为系统为每个组件分配的Id,可保证唯一性。若在组件未构建时获取,返回无效UniqueId:-1。

queryNavDestinationInfo

queryNavDestinationInfo(): NavDestinationInfo | undefined;

查询自定义组件所属的NavDestination信息。

queryNavigationInfo

queryNavigationInfo(): NavigationInfo | undefined

查询自定义组件所属的Navigation信息。

queryRouterPageInfo

queryRouterPageInfo(): RouterPageInfo | undefined;

获取RouterPageInfo实例对象。