Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stage 模型 - UIAbility 生命周期 #48

Open
cnwutianhao opened this issue May 18, 2024 · 0 comments
Open

Stage 模型 - UIAbility 生命周期 #48

cnwutianhao opened this issue May 18, 2024 · 0 comments

Comments

@cnwutianhao
Copy link
Owner

UIAbility 就是 UI 界面的组件,提供一个用来绘制界面的窗口,应用就展现出来。一个应用内部会包含一个或多个 UIAbility。是系统内部,应用调度的基本单元。在应用运行的过程,其实就是一个个 UIAbility 创建、切换、销毁的过程。

一、UIAbility 生命周期过程

我们在手机桌面点击APP的图标,当 Stage 创建好以后,去 Create 入口 Ability。

当舞台创建好,然后舞台上要表演的 Ability 也创建好,但是还在幕后,这就需要从幕后挪到台前变成 Foreground,也就是前台状态,这时我们才能够看到应用所对应的 UI 界面。

在界面我们会点击各种各样的功能,当我们从一级页面 A 切换到二级页面 B(是一个独立的功能,就会有一个独立的 Ability)时,也就创建了新的 Ability,系统发现这个功能不在当前这个 Ability 里,就会去找到底在哪里 Ability 里,然后创建出来挪到前台,也就是再走一遍 Create -> Foreground 的过程。也就是说 B 这个 Ability 跑到舞台前台。舞台只能展示一个 Ability,当 B 跑到前台时,A 就跑到后台 Background

当我们通过任务列表清除应用时,也就是销毁 Destroy 所有创建好的 Ability。

如图1所示:

图1

二、完整的 UIAbility、WindowStage 生命周期变化

UIAbility 里面持有 WindowStage,也就是 Window 的舞台。随着 UIAbility 生命周期的变化,WindowStage 状态也在发生变化。

随着 UIAbility 的创建 Create,不会立刻切换到前台 Foreground,而是先会去把对应的 WindowStage 给它创建出来,即 WindowStageCreate,因为有了 Window 舞台,才能有窗口,才能有页面。然后再把 UIAbility 切换到前台 Foreground。切换到前台以后,WindowStage 状态从原来不可见变成可见 Visible,并且获取焦点 Active

将来这个 UIAbility 展示出来以后,还可能把它切到后台,变成一个后台应用。这个时候 WindowStage 也会发生变化。它会从获取焦点变成失焦 InActive,从可见变成不可见 InVisible。接着再把整个 UIAbility 连带窗口一起挪到后台 Background。变成一个后台应用。

当 UIAbility 被销毁的时候,对应的 WindowStage 也要被销毁。在销毁 UIAbility 之前,先销毁 WindowStage,即 WindowStageDestroy。再去销毁 UIAbility,即 Destroy

如图2所示:

图2

三、代码验证生命周期

在 /entry/src/main/ets/entryability/ 中,会有入口 Ability,即 EntryAbility.ts,每个 Ability 都有自己的生命周期,生命周期就定义在 Ability 里:

import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import window from '@ohos.window';

// 继承 UIAbility
export default class EntryAbility extends UIAbility {
  // 创建
  onCreate(want, launchParam) {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
  }

  // 销毁
  onDestroy() {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
  }

  // WindowStage 创建
  onWindowStageCreate(windowStage: window.WindowStage) {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    // 加载 /pages.Index.ets(也就解释了应用打卡默认展示首页的原因)
    windowStage.loadContent('pages/Index', (err, data) => {
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
    });
  }

  // WindowStage 销毁
  onWindowStageDestroy() {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
  }

  // 前台
  onForeground() {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
  }

  // 后台
  onBackground() {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
  }
}

运行程序,查看 log:

Ability onCreate
Ability onWindowStageCreate
Ability onForeground
Succeeded in loading the content. Data:

当我们点击 Home 按钮,查看 log:

Ability onBackground

点击任务列表按钮,点击刚才的程序,查看 log:

Ability onForeground

在应用内部的主页面,点击返回按钮,查看 log:

Ability onBackground
Ability onWindowStageDestroy
Ability onDestroy

四、总结

UIAbility 会经历如下几个阶段:

  1. 应用启动时,Ability 被创建。

    Ability onCreate
    
  2. Ability 创建之后,Ability 所持有的 WindowStage 被创建。

    Ability onWindowStageCreate
    
  3. WindowStage 创建之后,应用就可以切换到前台,同时对应的窗口被展示出来。

    Ability onForeground
    
  4. 窗口展示出来后,就可以加载窗口里面的页面,就可以看到页面内的内容。

    Succeeded in loading the content. Data:
    
  5. 如果我们在访问页面的某个功能时,不属于当前 Ability,就会触发其它 Ability 的 Create

    Ability onCreate
    Ability onWindowStageCreate
    Ability onForeground
    Succeeded in loading the content. Data:
    
  6. 之前的 Ability 就会被切到后台。

    Ability onBackground
    
  7. 之前的 Ability 也可以再切换回前台。

    Ability onForeground
    
  8. 退出应用,也就是销毁。

    Ability onBackground
    Ability onWindowStageDestroy
    Ability onDestroy
    
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant