上述应用进程前后台的切换时机不包含2in1应用,2in1应用仅在启动时被系统切换到前台状态,退出时被系统切换到后台状态。
当用户在执行应用启动、应用前后台切换、应用退出等操作时,应用的整体生命周期状态会随之发生变化。理解应用的生命周期有助于开发者在合适的时机进行资源申请与释放、业务状态管理等操作。本章节主要介绍应用的生命周期状态、应用生命周期与应用进程及应用组件(UIAbility、ExtensionAbility)的关系,以及如何监听应用生命周期状态的变化。
应用生命周期与应用进程的关系
当应用的首个进程创建时,意味着应用的启动;当应用的所有进程结束时,则意味着应用退出(具体关联见下图)。

应用进程生命周期与UIAbility组件的关系
应用进程的生命周期直接制约并影响着UIAbility组件的生命周期(具体关联见下图)。

UIAbility组件生命周期的前后台回调与进程的前后台状态密切相关,但二者并非完全等同:
UIAbility状态和进程状态的对应关系如下(假设进程内有两个UIAbility组件):
| UIAbility状态 | 进程内窗口状态 | 进程状态 |
|---|---|---|
| 任一UIAbility处于前台状态 | 可见状态 | 前台状态 |
| 任一UIAbility处于前台状态 | 不可见状态 | 前台状态 |
| 所有UIAbility处于后台状态 | 可见状态 | 前台状态 |
| 所有UIAbility处于后台状态 | 不可见状态 | 后台状态 |
应用进程生命周期与ExtensionAbility组件的关系
当首个ExtensionAbility组件被创建时,会先创建相应的应用进程;当应用进程被销毁时,该进程的所有ExtensionAbility组件也会被销毁。
应用进程切换到前台的时机:
应用进程切换到后台的时机:
上述应用进程前后台的切换时机不包含2in1应用,2in1应用仅在启动时被系统切换到前台状态,退出时被系统切换到后台状态。
应用需要先申请ohos.permission.RUNNING_STATE_OBSERVER权限,然后使用on('applicationState')方法可以监听全部应用的状态;使用on('applicationState')方法可以监听指定应用的状态。通过实现ApplicationStateObserver接口中的onAppStarted()方法,可以监听应用的启动。通过实现ApplicationStateObserver接口中的onAppStopped()方法,可以监听应用的退出。
应用使用ApplicationContext的on('applicationStateChange')方法可以监听应用的前后台状态变化,当应用前后台切换时,可以收到相应回调函数的通知,从而执行一些依赖前后台的方法,或者进行应用前后台切换频率等数据统计。
以UIAbilityContext中的使用为例进行说明。
上述的回调事件均为异步回调,无严格的时序关系。
import { UIAbility, ApplicationStateChangeCallback } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
const TAG = '[LifecycleAbility]';
const DOMAIN = 0xF811;
export default class LifecycleAbility extends UIAbility {
onCreate() {
let applicationStateChangeCallback: ApplicationStateChangeCallback = {
onApplicationForeground() {
hilog.info(DOMAIN, TAG, 'applicationStateChangeCallback onApplicationForeground');
},
onApplicationBackground() {
hilog.info(DOMAIN, TAG, 'applicationStateChangeCallback onApplicationBackground');
}
}
// 1.获取applicationContext
let applicationContext = this.context.getApplicationContext();
try {
// 2.通过applicationContext注册应用前后台状态监听
applicationContext.on('applicationStateChange', applicationStateChangeCallback);
} catch (paramError) {
hilog.error(DOMAIN, TAG, `error: ${(paramError as BusinessError).code}, ${(paramError as BusinessError).message}`);
}
hilog.info(DOMAIN, TAG, 'Register applicationStateChangeCallback');
}
} module.json5文件的deviceTypes仅声明支持PC/2in1设备的应用,其UIAbility的生命周期回调触发机制与其他设备存在差异。
当用户启动一个UIAbility时,系统会依次触发onCreate()、onWindowStageCreate()、onForeground()生命周期回调,完成组件创建、生命周期驱动等流程。
当用户进行应用间切换时,UIAbility会保持前台状态,系统不会触发onBackground()生命周期回调。
用户主动退出UIAbility和应用主动退出UIAbility时,系统才会触发onBackground()和onDestroy()生命周期回调,完成组件退出和销毁。
进程的生命周期与UIAbility组件的生命周期密切相关。由于UIAbility运行态长期处于前台状态,故进程长期处于前台状态,仅在进程正常退出过程中短暂处于后台状态。相应地,应用也长期处于前台状态,仅在应用正常退出过程中短暂处于后台状态。