在HarmonyOS应用开发中,通过startAbility启动页面时,StartOptions参数往往被忽视,但它能精准控制启动方式,避免“先全屏再分屏”的闪烁问题。本文基于实际开发经验,梳理StartOptions核心配置、适用场景及常见陷阱。
一、StartOptions是什么
StartOptions是启动参数包,在调用startAbility时传入,告诉系统目标页面的窗口模式、位置、大小、动画等。导入方式:- import { StartOptions } from '@kit.AbilityKit';
复制代码
二、窗口模式配置
windowMode字段控制启动时的窗口形态,支持全屏、分屏(主副屏)、浮动窗口,尤其适合平板和2in1设备。示例:- let options: StartOptions = {
- windowMode: AbilityConstant.WindowMode.WINDOW_MODE_SPLIT_SECONDARY // 分屏副屏
- };
复制代码 注意:该字段从API 12开始支持,低版本需判断SDK。
三、控制标题栏窗口模式按钮
通过supportWindowModes限制用户可切换的窗口模式,避免布局错乱:- let options: StartOptions = {
- supportWindowModes: [
- bundleManager.SupportWindowMode.FULL_SCREEN,
- bundleManager.SupportWindowMode.SPLIT
- // 不添加FLOATING,用户无法切到悬浮窗
- ]
- };
复制代码 若不设置,默认走module.json5中的supportWindowMode。
四、分屏比例设置(API 26+)
splitRatio字段可指定分屏时窗口占比,例如副屏占30%:- let options: StartOptions = {
- windowMode: AbilityConstant.WindowMode.WINDOW_MODE_SPLIT_SECONDARY,
- splitRatio: { ratio: 0.3 }
- };
复制代码
五、指定显示屏幕
displayId用于多屏场景(平板接显示器、2in1外接屏),指定目标屏幕:- let options: StartOptions = {
- displayId: 0 // 主屏,API 14后默认-1(当前屏幕)
- };
复制代码
六、启动动画控制
withAnimation字段关闭启动动画,视觉上提升响应速度:- let options: StartOptions = {
- withAnimation: false // 只在2in1和自由窗口Tablet设备生效,需同应用
- };
复制代码
七、窗口位置和尺寸(仅自由窗口模式有效)
在自由窗口模式下,指定初始位置和大小:- let options: StartOptions = {
- windowLeft: 100, // px单位
- windowTop: 200,
- windowWidth: 800,
- windowHeight: 600
- };
复制代码 注意:单位是px不是vp,可通过vp2px换算:- let uiContext = this.getUIContext();
- let pxValue = uiContext.vp2px(100);
复制代码 windowLeft和windowTop需同时设置,否则窗口位置可能异常。
八、窗口尺寸限制
限制自由窗口的最大最小尺寸(单位vp),防止拖拽过度:- let options: StartOptions = {
- minWindowWidth: 320,
- minWindowHeight: 240,
- maxWindowWidth: 2560,
- maxWindowHeight: 2560
- };
复制代码
九、隐藏启动(启动但不显示)
场景:后台监控服务,等条件触发后再显示界面。需同时设置processMode和startupVisibility:- import { contextConstant } from '@kit.AbilityKit';
- let options: StartOptions = {
- processMode: contextConstant.ProcessMode.NEW_PROCESS,
- startupVisibility: contextConstant.StartupVisibility.INVISIBLE
- };
复制代码 两者必须成对使用,缺一不可。仅在2in1和Tablet设备生效。
十、自定义启动页
动态设置启动页图标和背景色(仅启动当前应用时生效):- let imagePixelMap: image.PixelMap = await image.createPixelMap(color, {...});
- let options: StartOptions = {
- startWindowIcon: imagePixelMap,
- startWindowBackgroundColor: '#E510FFFF' // ARGB
- };
复制代码
十一、隐藏启动页
hideStartWindow设置为true可关闭启动页,避免应用启动快时的闪烁:- let options: StartOptions = {
- hideStartWindow: true // API 20+,仅2in1和自由窗口Tablet生效
- };
复制代码
十二、获取启动结果(API 20+)
通过completionHandler获取目标Ability的详细启动状态:- let completionHandler: CompletionHandler = {
- onRequestSuccess: (elementName, message) => { ... },
- onRequestFailure: (elementName, message) => { ... }
- };
- let options: StartOptions = { completionHandler };
复制代码
十三、常见踩坑与注意事项
1. 窗口位置尺寸仅在自由窗口模式下生效,平板全屏模式下不会生效。
2. processMode和startupVisibility必须同时设置。
3. 窗口位置尺寸单位是px,而非vp,需用vp2px换算。
4. 不要堆砌参数,每个字段都有特定设备和场景限制,根据实际按需配置。
5. 与启动模式配合:singleton模式下第二次启动不会触发窗口位置变化,若需每次重新定位,使用multiton或specified模式。
十四、startAbility的调用形式
支持callback、Promise、无options三种形式。callback的err仅表示调用本身是否成功,不等于目标Ability启动成功;获取真实结果应使用completionHandler。
十五、startAbilityForResult组合使用
可在启动目标页面时传入StartOptions,同时等待返回结果,例如在分屏模式下选择图片:- let options: StartOptions = {
- windowMode: AbilityConstant.WindowMode.WINDOW_MODE_SPLIT_SECONDARY
- };
- context.startAbilityForResult(want, options).then((result) => {
- // 处理返回数据
- });
复制代码
十六、小建议
- 先确认设备能力(是否支持自由窗口、多屏)。
- 不要过度配置,手机应用无需设置自由窗口参数。
- 业务参数放在Want的parameters中,StartOptions仅控制启动方式。
- 多测试窗口模式切换,确保UI正常。
参考文档:华为开发者官网《应用启动设置》。 |