HarmonyOS鸿蒙Next中如何判断应用是否在前台

HarmonyOS鸿蒙Next中如何判断应用是否在前台

方法一:通过ApplicationContext实现应用状态监听

ApplicationContext.on(‘applicationStateChange’) 注册对当前应用前后台变化的监听。使用callback异步回调。仅支持主线程调用。

import { UIAbility, ApplicationStateChangeCallback } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

export default class MyAbility extends UIAbility {
  onCreate() {
    console.log('MyAbility onCreate');
    let applicationStateChangeCallback: ApplicationStateChangeCallback = {
      onApplicationForeground() {
        console.info('applicationStateChangeCallback onApplicationForeground');
      },
      onApplicationBackground() {
        console.info('applicationStateChangeCallback onApplicationBackground');
      }
    }

    // 1.获取applicationContext
    let applicationContext = this.context.getApplicationContext();
    try {
      // 2.通过applicationContext注册应用前后台状态监听
      applicationContext.on('applicationStateChange', applicationStateChangeCallback);
    } catch (paramError) {
      console.error(`error: ${(paramError as BusinessError).code}, ${(paramError as BusinessError).message}`);
    }
    console.log('Resgiter applicationStateChangeCallback');
  }
}

以上方法会有局限性,当应用处于多任务窗口,或者PC前台有多个应用相互遮挡,仍认为应用处于前台;如果有对应场景需要获取应用是否处于顶层或者是否处于可交互状态,则需要用到方法二。

方法二:通过WindowStage实现应用状态监听

// EntryAbility.ets
import { UIAbility } from '@kit.AbilityKit';

export default class EntryAbility extends UIAbility {
  // ...

  onWindowStageCreate(windowStage: window.WindowStage) {
    console.log('onWindowStageCreate');
    const callback = (windowStageEventType: window.WindowStageEventType) => {
      // ...
    }
    try {
      windowStage.on('windowStageEvent', callback);
    } catch (exception) {
      console.error(`Failed to enable the listener for window stage event changes. Cause code: ${exception.code}, message: ${exception.message}`);
    }
    try {
      windowStage.off('windowStageEvent', callback);
      // 如果通过on开启多个callback进行监听,同时关闭所有监听:
      windowStage.off('windowStageEvent');
    } catch (exception) {
      console.error(`Failed to disable the listener for window stage event changes. Cause code: ${exception.code}, message: ${exception.message}`);
    }
  }
};

其中 WindowStageEventType 有五种状态:SHOWN、ACTIVE、INACTIVE、HIDDEN、RESUMED、PAUSED,可以更加精细区分当前应用的状态。

名称 说明
SHOWN 1 切到前台,例如点击应用图标启动,无论是首次启动还是从后台启动均会触发。
ACTIVE 2 获焦状态,例如应用窗口处理点击事件后的状态、应用启动后的状态。
INACTIVE 3 失焦状态,例如打开新应用或点击其他窗口后,原获焦窗口的状态。
HIDDEN 4 切到后台,例如应用上滑退出、应用窗口关闭。
RESUMED 5 前台可交互状态,例如应用打开后,可以与用户交互的状态。
PAUSED 6 前台不可交互状态,例如从屏幕底部上划,应用进入到多任务界面后的状态。

更多关于HarmonyOS鸿蒙Next中如何判断应用是否在前台的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

学习了

更多关于HarmonyOS鸿蒙Next中如何判断应用是否在前台的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


通过ApplicationContext的getRunningProcessInformation()方法获取进程信息,其中包含当前进程运行状态,可以判断是否处于前台。代码示例:

build() {
  RelativeContainer() {
    Button('获取信息').onClick(() => {
      let applicationContext = this.getUIContext().getHostContext()?.getApplicationContext();
      applicationContext?.getRunningProcessInformation().then((data) => {
        console.log(`The process running information is: ${JSON.stringify(data)}`);
      });
    })
  }
  .height('100%')
  .width('100%')
}

在HarmonyOS Next中,判断应用是否在前台可以使用UIAbilityContextgetAbilityState()方法。通过获取当前UIAbility的状态,若状态为ABILITY_STATE_FOREGROUND,则表示应用处于前台。此外,也可以监听onForegroundonBackground生命周期回调来跟踪前后台状态变化。

在HarmonyOS Next中,判断应用是否在前台主要有两种方法,您提供的资料已经非常详细和准确。

方法一:使用ApplicationContext监听应用级状态 这是最直接的方法,用于监听整个应用的前后台切换。

  • 核心API: applicationContext.on('applicationStateChange', callback)
  • 回调事件: onApplicationForeground (应用进入前台) 和 onApplicationBackground (应用退到后台)。
  • 特点与局限: 实现简单,能有效应对大多数单任务场景。但其判断的是“应用进程”是否活跃。在分屏、小窗或PC多窗口重叠的场景下,即使应用窗口部分可见或失去焦点,只要进程未被挂起,仍可能被判定为“前台”。因此,它更适合处理如资源申请/释放、后台数据同步等与应用生命周期强相关的逻辑。

方法二:使用WindowStage监听窗口级状态 当需要更精确地判断应用窗口的可见性与交互状态时,应使用此方法。

  • 核心API: windowStage.on('windowStageEvent', callback)
  • 关键状态:
    • ACTIVE (2): 窗口获焦,可接收用户输入。通常将此状态等同于“应用在前台且可交互”
    • INACTIVE (3): 窗口失焦(如打开了另一个弹窗或应用)。
    • HIDDEN (4): 窗口完全不可见(如切到后台或关闭窗口)。通常将此状态等同于“应用在后台”
    • RESUMED (5) / PAUSED (6): 进一步区分前台的可交互状态,例如应用在多任务视图中可见(PAUSED)但无法直接操作。
  • 适用场景: 需要根据窗口是否获得焦点来启停动画、音视频播放、高精度定时任务等。这是实现多窗口环境下精确状态判断的推荐方式。

总结与选择建议

  • 如果只需知道应用是否在后台运行,使用方法一 (ApplicationContext) 更轻量。
  • 如果需要知道应用窗口是否对用户可见、是否获得焦点,尤其是在多窗口设备上,必须使用方法二 (WindowStage) 并监听 ACTIVEHIDDEN 等事件。

您的代码示例完全正确,直接可用于开发。根据实际业务场景的精度要求,选择合适的方法即可。

回到顶部