HarmonyOS 鸿蒙Next中如何判断当前设备是否处于自由多窗状态

HarmonyOS 鸿蒙Next中如何判断当前设备是否处于自由多窗状态 目前部分手机(Mate XTs三屏展开态)、平板、电脑均支持自由窗口模式,应用某些业务场景下(如实现沉浸式等)需要判断当前设备是否处于自由多窗状态。

开发者可以通过获取windowStatusType的值来判断设备目前的窗口模式。当windowStatusType为FLOATING时表示此时为自由悬浮窗模式:

  • 电脑设备,应用主窗当windowStatusType===FLOATING时,为自由多窗状态。假设应用设置了受限的全局悬浮窗,则可以通过判断该窗口是否为创建的悬浮窗区分,可参考电脑设置悬浮窗
  • 手机和平板应用主窗由于支持悬浮窗模式,所以需要加一层额外的判断,即此时自由多窗开关是否打开(打开系统下拉控制栏的自由多窗开关)。
  • 此外,考虑到自由多窗模式下,点击了最大化按钮,此时windowStatusType===MAXIMIZE,这种状态下依然为自由多窗模式(此条件可由应用自行决定是否作为判断自由多窗的条件)。

总结上面所述,判断当前设备是否处于自由多窗状态的方案如下(示例代码针对应用主窗):

  • 1.获取当前windowStatusType的值(方法可参考获取窗口模式),值为FLOATING或MAXIMIZE时,继续第2步;
  • 2.若当前为电脑设备,则可以判断为自由多窗模式;若不是电脑设备,继续第3步;
  • 3.判断当前设备是否打开了自由多窗开关,若是则可以判断为自由多窗模式;若不是,则为悬浮窗模式,非自由多窗状态。
// 步骤一:windowStatusType为FLOATING或MAXIMIZE
if (windowStatusType === window.WindowStatusType.FLOATING || windowStatusType === window.WindowStatusType.MAXIMIZE) {
  // 步骤二:当前设备为电脑设备,此时为自由多窗模式
  if (deviceInfo.deviceType === '2in1') {
    this.isFreeWindow = true;
    return;
  }
  // 步骤三:主动获取当前手机/平板的自由窗口开关是否打开,回调返回为true表示为打开状态,此时为自由多窗模式
  settings.getValue(this.getUIContext().getHostContext(), 'window_pcmode_switch_status',
    settings.domainName.USER_PROPERTY).then((data) => {
    if (data) {
      this.isFreeWindow = true;
    }
  }).catch(() => {
    // 不支持自由多窗模式的设备会查询不到字段,catch到异常
  });
}
// 否则不是自由多窗模式
this.isFreeWindow = false;

步骤3中除了主动获取手机/平板是否打开自由多窗开关,还可以通过监听的方式获得:

export function observePcMode() {
  if (canIUse('SystemCapability.Applications.Settings.Core')) {
    // 设置监听
    settings.registerKeyObserver(getContext(), 'window_pcmode_switch_status', settings.domainName.USER_PROPERTY,
      () => {
        // 主动获取值
        settings.getValue(getContext(), 'window_pcmode_switch_status', settings.domainName.USER_PROPERTY)
            .then((data) => {
              this.isFreeWindow = true;
            })
            .catch(() => {
              // 不支持自由多窗模式的设备会查询不到字段,catch到异常
            })
      }
    )
  }
}

更多关于HarmonyOS 鸿蒙Next中如何判断当前设备是否处于自由多窗状态的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

在HarmonyOS Next中,可以通过windowManager模块的getLastWindowMode方法判断。该方法返回当前窗口模式,若返回值为WindowMode.WINDOW_MODE_FLOATING,则表明设备处于自由多窗状态。具体实现需导入@ohos.window模块并调用相关API。

更多关于HarmonyOS 鸿蒙Next中如何判断当前设备是否处于自由多窗状态的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,判断当前设备是否处于自由多窗状态,核心是结合窗口状态和设备类型进行综合判断。您提供的方案和代码逻辑是正确且完整的。

关键点总结如下:

  1. 首要条件:应用主窗的 windowStatusType 必须为 FLOATING(自由悬浮)或 MAXIMIZE(最大化)。这是触发判断流程的基础。
  2. 设备区分处理
    • 对于PC(deviceType 为 ‘2in1’):当窗口状态为 FLOATING 时,即可判定为自由多窗模式。
    • 对于手机/平板:在窗口状态满足条件后,必须额外检查系统级“自由多窗”开关是否开启。这是区分“全局悬浮窗”与“自由多窗”的关键。您需要通过 settings.getValue 查询 ‘window_pcmode_switch_status’ 这个配置项的值。
  3. 监听状态变化:为了动态响应系统开关的变化,可以使用 settings.registerKeyObserver 监听上述配置键,从而实时更新应用内的状态判断。

您提供的示例代码清晰地展示了这一判断流程:先检查窗口状态,再根据设备类型分流,最后对移动设备查询系统开关。这是一种标准且可靠的实现方式。

回到顶部