We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
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
UIAbility 就是 UI 界面的组件,提供一个用来绘制界面的窗口,应用就展现出来。一个应用内部会包含一个或多个 UIAbility。是系统内部,应用调度的基本单元。在应用运行的过程,其实就是一个个 UIAbility 创建、切换、销毁的过程。
我们在手机桌面点击APP的图标,当 Stage 创建好以后,去 Create 入口 Ability。
Create
当舞台创建好,然后舞台上要表演的 Ability 也创建好,但是还在幕后,这就需要从幕后挪到台前变成 Foreground,也就是前台状态,这时我们才能够看到应用所对应的 UI 界面。
Foreground
在界面我们会点击各种各样的功能,当我们从一级页面 A 切换到二级页面 B(是一个独立的功能,就会有一个独立的 Ability)时,也就创建了新的 Ability,系统发现这个功能不在当前这个 Ability 里,就会去找到底在哪里 Ability 里,然后创建出来挪到前台,也就是再走一遍 Create -> Foreground 的过程。也就是说 B 这个 Ability 跑到舞台前台。舞台只能展示一个 Ability,当 B 跑到前台时,A 就跑到后台 Background。
Background
当我们通过任务列表清除应用时,也就是销毁 Destroy 所有创建好的 Ability。
Destroy
如图1所示:
UIAbility 里面持有 WindowStage,也就是 Window 的舞台。随着 UIAbility 生命周期的变化,WindowStage 状态也在发生变化。
随着 UIAbility 的创建 Create,不会立刻切换到前台 Foreground,而是先会去把对应的 WindowStage 给它创建出来,即 WindowStageCreate,因为有了 Window 舞台,才能有窗口,才能有页面。然后再把 UIAbility 切换到前台 Foreground。切换到前台以后,WindowStage 状态从原来不可见变成可见 Visible,并且获取焦点 Active。
WindowStageCreate
Visible
Active
将来这个 UIAbility 展示出来以后,还可能把它切到后台,变成一个后台应用。这个时候 WindowStage 也会发生变化。它会从获取焦点变成失焦 InActive,从可见变成不可见 InVisible。接着再把整个 UIAbility 连带窗口一起挪到后台 Background。变成一个后台应用。
InActive
InVisible
当 UIAbility 被销毁的时候,对应的 WindowStage 也要被销毁。在销毁 UIAbility 之前,先销毁 WindowStage,即 WindowStageDestroy。再去销毁 UIAbility,即 Destroy。
WindowStageDestroy
如图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 会经历如下几个阶段:
应用启动时,Ability 被创建。
Ability onCreate
Ability 创建之后,Ability 所持有的 WindowStage 被创建。
Ability onWindowStageCreate
WindowStage 创建之后,应用就可以切换到前台,同时对应的窗口被展示出来。
窗口展示出来后,就可以加载窗口里面的页面,就可以看到页面内的内容。
Succeeded in loading the content. Data:
如果我们在访问页面的某个功能时,不属于当前 Ability,就会触发其它 Ability 的 Create
之前的 Ability 就会被切到后台。
之前的 Ability 也可以再切换回前台。
退出应用,也就是销毁。
The text was updated successfully, but these errors were encountered:
No branches or pull requests
一、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所示:
二、完整的 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所示:
三、代码验证生命周期
在 /entry/src/main/ets/entryability/ 中,会有入口 Ability,即 EntryAbility.ts,每个 Ability 都有自己的生命周期,生命周期就定义在 Ability 里:
运行程序,查看 log:
当我们点击 Home 按钮,查看 log:
点击任务列表按钮,点击刚才的程序,查看 log:
在应用内部的主页面,点击返回按钮,查看 log:
四、总结
UIAbility 会经历如下几个阶段:
应用启动时,Ability 被创建。
Ability 创建之后,Ability 所持有的 WindowStage 被创建。
WindowStage 创建之后,应用就可以切换到前台,同时对应的窗口被展示出来。
窗口展示出来后,就可以加载窗口里面的页面,就可以看到页面内的内容。
如果我们在访问页面的某个功能时,不属于当前 Ability,就会触发其它 Ability 的 Create
之前的 Ability 就会被切到后台。
之前的 Ability 也可以再切换回前台。
退出应用,也就是销毁。
The text was updated successfully, but these errors were encountered: