【鸿蒙HarmonyOS NEXT】UIAbility的生命周期
一、环境说明
-
DevEco Studio 版本:
-
API版本:
以12为主
二、UIAbility的生命周期
概念: HarmonyOS中的UIAbility是一种包含用户界面的应用组件
,主要用于与用户进行交互,并且是系统调度
的基本单元
,为应用提供窗口
在其中绘制界面
。
UIAbility是HarmonyOS系统中用于构建用户界面的基本组件之一,负责处理应用程序界面的显示和交互。
作用: 每个UIAbility实例都对应于一个最近任务列表中的任务,可以独立展示、交互和管理数据。一个应用可以包含一个或多个UIAbility,每个UIAbility可以对应多个页面,建议将独立的功能模块放到一个UIAbility中,以多页面的形式呈现。
UIAbility生命周期图 :
UIAbility的生命周期
包括Create、Foreground、Background、Destroy四个主要状态
,以及WindowStageCreate和WindowStageDestroy
两个与窗口管理
相关的回调
。
Create状态:在UIAbility实例创建时触发,系统会调用onCreate回调。在此回调中,可以进行初始化操作,如变量定义、资源加载等。例如用户打开电池管理应用,在应用加载过程中,在UI页面可见之前,可以在onCreate回调中读取当前系统的电量情况,用于后续的UI页面展示。
WindowStageCreate状态 :在UIAbility实例创建完成之后,进入Foreground之前,系统会创建一个WindowStage。WindowStage是本地窗口管理器
,用于管理窗口相关的内容,如获焦/失焦、可见/不可见等。可以在onWindowStageCreate回调中设置UI页面加载
和WindowStage的事件订阅。
在onWindowStageCreate(windowStage)中通过loadContent接口设置应用要加载的页面。例如用户打开游戏应用,正在打游戏的时候,有一个消息通知,打开消息,消息会以弹窗的形式弹出在游戏应用的上方,此时,游戏应用就从获焦切换到了失焦状态,消息应用切换到了获焦状态。对于消息应用,在onWindowStageCreate回调中,会触发获焦的事件回调,可以进行设置消息应用的背景颜色、高亮等操作。
typescript
import UIAbility from '@ohos.app.ability.UIAbility';
import window from '@ohos.window';
export default class EntryAbility extends UIAbility {
...
onWindowStageCreate(windowStage: window.WindowStage) {
// 设置UI页面加载
// 设置WindowStage的事件订阅(获焦/失焦、可见/不可见)
...
windowStage.loadContent('pages/Index', (err, data) => {
...
});
}
...
}
Foreground状态: 在UIAbility的UI界面可见之前触发,对应于onForeground回调。可以在此回调中申请系统需要的资源,或者重新申请在Background状态中释放的资源。例如用户打开地图应用查看当前地理位置的时候,假设地图应用已获得用户的定位权限授权。在UI页面显示之前,可以在onForeground回调中打开定位功能,从而获取到当前的位置信息。
Background状态:在UIAbility的UI界面完全不可见之后触发,对应于onBackground回调。可以在此回调中释放UI界面不可见时无用的资源,或者执行较为耗时的操作,如状态保存等。当地图应用切换到后台状态,可以在onBackground回调中停止定位功能,以节省系统的资源消耗。
WindowStageDestroy状态:在UIAbility实例销毁之前触发,对应于onWindowStageDestroy回调。可以在此回调中释放UI页面资源,如注销在WindowStageCreate中设置的订阅事件。
Destroy状态:在UIAbility销毁时触发,可以在onDestroy回调中进行系统资源的释放、数据的保存等操作。例如用户使用应用的程序退出功能,会调用UIAbilityContext的terminalSelf()方法,从而完成UIAbility销毁。或者用户使用最近任务列表关闭该UIAbility实例时,也会完成UIAbility的销毁。
三、示例代码加以说明
沿用【鸿蒙HarmonyOS NEXT】页面之间相互传递参数博文中的代码,进行测试。
测试步骤如下:
-
打开模拟器,并将代码部署到模拟器上,当模拟器正常运行代码后,查看DevEco Studio控制台上的日志,截图如下:
日志内容:
shellA03d00/JSAPP com.suben...arameter I Callee constructor is OK string A03d00/JSAPP com.suben...arameter I Ability::constructor callee is object [object Object] A00000/testTag com.suben...arameter I Ability onCreate A00000/testTag com.suben...arameter I Ability onWindowStageCreate A00000/testTag com.suben...arameter I Ability onForeground A00000/testTag com.suben...arameter I Succeeded in loading the content.
-
点击手机模拟器上应用的登录按钮,跳转到了首页,然后再从首页返回登录页,查看控制台日志,内容如截图橙色框所示:
注意:上述代码是
基于单UIAbility多页面开发的应用
,因当前UIAbility仍处于前台的状态。 -
按住手机模拟器右边的圆形框返回手机模拟器屏幕,让该应用退到后台,再查看控制台日志的打印情况,具体如下:
控制台日志截图如下:
此时onBackground函数被调用。
-
当在手机模拟器上鼠标向上滑动列出最近打开应用的列表后,找到我们的应用程序,如下截图所示:
然后点击截图上的删除按钮其删除,此时查看控制台日志,内容如下:
shellA00000/testTag com.suben...arameter I Ability onBackground A00000/testTag com.suben...arameter I Ability onWindowStageDestroy A00000/testTag com.suben...arameter I Ability onDestroy
此时
onBackground函数
被调用。如截图所示:
四、小结
通过上述的说明和示例演示,相信大家已经很清楚UIAbility的生命周期了。细心的读者朋友可能会问,在真实的开发过程中该如何在这些诸如onCreate、onForeground、onBackground、onDestroy四个状态函数和两个窗口管理函数onWindowStageCreate和onWindowStageDestroy加入符合实际的业务代码呢?感兴趣的读者朋友可以尝试下在这些函数加上业务代码试试,看看这些函数是否可以正常运行呢?欢迎大家的留言,我们在留言区进行讨论。