目录

平板分屏状态下,点击跳转后的页面变为全屏展示

问题现象

应用在平板上打开,开启分屏模式后,点击页面内容跳转后,页面切换为全屏显示。

背景知识

UIAbility组件启动模式:UIAbility的启动模式是指UIAbility实例在启动时的不同呈现状态。针对不同的业务场景,系统提供了三种启动模式:singleton(单实例模式)、multiton(多实例模式)、specified(指定实例模式)。

问题定位

  1. 从设备底部上滑,查看系统后台任务列表,发现跳转页面后,后台存在两个UIAbility实例。
  2. 请检查代码中module.json5配置文件的launchType字段配置,当设置为multiton时即为多实例模式,此时每次调用startAbility()方法时,都会在应用进程中创建一个新的该类型UIAbility实例。
    {
      "module": {
        "abilities": [
          {
            "launchType": "multiton", // 表示使用的多实例模式,即在最近任务列表中可以看到有多个该类型的UIAbility实例。
          }
        ]
      }
    }
  3. 检查代码中是否使用startAbility()方法唤起新页面,多实例模式下唤起的新页面不会继承已经分屏的实例窗口显示模式。
    import { UIAbility, Want } from '@kit.AbilityKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    
    export default class EntryAbility extends UIAbility {
      onForeground() {
        let want: Want = {
          bundleName: 'com.example.myapplication',
          abilityName: 'EntryAbility'
        };
    
        try {
          this.context.startAbility(want, (err: BusinessError) => { // 通过startAbility唤起新的UIAbility实例
            if (err.code) {
              // 处理业务逻辑错误
              console.error(`startAbility failed, code is ${err.code}, message is ${err.message}`);
              return;
            }
            // 执行正常业务
            console.info('startAbility succeed');
          });
        } catch (err) {
          // 处理入参错误异常
          let code = (err as BusinessError).code;
          let message = (err as BusinessError).message;
          console.error(`startAbility failed, code is ${code}, message is ${message}`);
        }
      }
    }

分析结论

应用采用multiton多实例模式,且使用startAbility()方法打开新页面,此时不会保持原始窗口的分屏状态,导致新打开的页面呈现全屏状态。

修改建议

修改module.json5配置文件中的launchType字段配置值,设置为singleton单实例模式。