1. 鸿蒙应用启动页概述

在鸿蒙应用开发中,启动页(Splash Screen)是用户打开应用时看到的第一个界面,通常展示品牌Logo、应用名称或加载动画。作为应用的门面,启动页的设计直接影响用户对产品的第一印象。鸿蒙系统对启动页的实现提供了标准化支持,开发者可以通过配置文件快速定制启动页的样式和行为。

启动页在鸿蒙中的核心作用包括:

  • 提升用户体验:在应用初始化阶段提供视觉反馈,避免白屏等待
  • 品牌曝光:强化应用品牌形象和视觉识别
  • 资源预加载:为后续主界面渲染争取时间
  • 权限引导:在部分场景下展示必要的权限说明

鸿蒙4.0及以后版本对启动页机制进行了优化,支持更灵活的配置方式和动画效果。与Android的SplashScreen API不同,鸿蒙的启动页实现更加轻量级,主要通过修改工程配置文件即可完成定制。

2. 鸿蒙启动页的分类方式

2.1 按显示内容分类

静态图片启动页 是最常见的类型,适用于大多数应用场景。开发者只需准备一张分辨率适配的图片(推荐使用.png格式),在module.json5中指定即可。图片尺寸建议为720x1280px(宽高比9:16),以保证在不同设备上的显示效果。

动态启动页 通过Lottie动画或自定义绘制实现,能提供更生动的视觉效果。鸿蒙支持通过Ability的onWindowStageCreate生命周期回调实现自定义动画:

onWindowStageCreate(windowStage: window.WindowStage) {
    // 创建动画Surface
    let windowClass = windowStage.getMainWindow()
    windowClass.loadContent('pages/SplashAnimation', (err) => {
        if (err) {
            console.error('Failed to load the content. Cause:' + JSON.stringify(err))
            return
        }
        // 动画结束后跳转主页面
        setTimeout(() => {
            windowClass.setUIContent('pages/Index')
        }, 2000)
    })
}

渐进式启动页 会随着应用初始化进度更新显示内容,常见于需要预加载大量资源的应用。实现方案通常结合@ohos.app.ability.Ability和@ohos.app.ability.UIAbility:

onWindowStageCreate(windowStage: window.WindowStage) {
    const context = this.context
    const windowClass = windowStage.getMainWindow()
    
    // 分阶段更新UI
    windowClass.loadContent('pages/SplashProgress', () => {
        this.updateProgress(30) // 初始化第一阶段
        this.initSDK().then(() => {
            this.updateProgress(70) // SDK加载完成
            return this.preloadData()
        }).then(() => {
            this.updateProgress(100)
            windowClass.setUIContent('pages/Main')
        })
    })
}

2.2 按业务场景分类

冷启动页 是应用进程完全新建时显示的启动页,需要完整初始化运行环境。在module.json5中配置的启动页默认就是冷启动场景:

{
  "module": {
    "abilities": [
      {
        "launchType": "standard",
        "splashScreen": {
          "backgroundImage": "resources/base/media/splash.png",
          "icon": "resources/base/media/icon.png",
          "roundIcon": "resources/base/media/roundIcon.png"
        }
      }
    ]
  }
}

热启动页 出现在应用已驻留后台再次被唤醒时。鸿蒙默认不显示热启动页,如需定制可通过abilityInfo的launchReason判断:

onWindowStageCreate(windowStage: window.WindowStage) {
    const abilityInfo = this.context.abilityInfo
    if (abilityInfo.launchReason !== ability.LaunchReason.COLD) {
        // 热启动直接跳转主页
        windowStage.getMainWindow().setUIContent('pages/Main')
    } else {
        // 冷启动显示完整启动页
        windowStage.getMainWindow().loadContent('pages/Splash')
    }
}

场景化启动页 根据不同的入口渠道显示不同内容。例如通过推送消息打开应用时显示相关通知内容:

onCreate(want: Want) {
    if (want.parameters?.notificationContent) {
        this.customSplashContent = want.parameters.notificationContent
    }
}

3. module.json5配置详解

3.1 基础配置参数

在module.json5中,每个ability都可以独立配置启动页参数。关键配置项包括:

"splashScreen": {
  "backgroundImage": "resources/base/media/splash_bg.png",
  "icon": "resources/base/media/app_icon.png",
  "roundIcon": "resources/base/media/app_round_icon.png",
  "backgroundOpacity": 0.9,
  "backgroundColor": "#FFFFFF",
  "textColor": "#000000",
  "duration": 2000,
  "windowBackground": "#FF9800"
}

各参数说明:

  • backgroundImage :启动页背景图路径(必填)
  • icon / roundIcon :中心图标(可选)
  • backgroundOpacity :背景透明度(0-1)
  • backgroundColor :背景色(图片加载失败时显示)
  • textColor :底部文字颜色
  • duration :最小显示时长(毫秒)
  • windowBackground :窗口过渡背景色

3.2 多设备适配配置

鸿蒙支持为不同设备类型配置不同的启动页资源。在resources目录下按设备类型建立子目录:

resources/
  ├── base/
  │   └── media/  # 默认资源
  │       ├── splash.png
  │       └── icon.png
  ├── phone/
  │   └── media/  # 手机专属资源
  │       ├── splash.png
  │       └── icon.png
  └── tablet/
      └── media/  # 平板专属资源
          ├── splash.png
          └── icon.png

系统会根据运行设备自动选择匹配的资源。对于特殊形态设备(如折叠屏),可以通过条件编译动态调整:

import deviceInfo from '@ohos.deviceInfo'

const { deviceType } = deviceInfo
if (deviceType === 'foldable') {
    // 折叠屏特殊布局
    this.splashImage = 'resources/foldable/media/splash_fold.png'
}

3.3 主题与暗黑模式适配

鸿蒙支持为启动页配置不同的主题样式。首先在resources/base/element目录下创建color.json:

{
  "color": [
    {
      "name": "splash_background",
      "value": "#FFFFFF"
    },
    {
      "name": "splash_text",
      "value": "#000000"
    }
  ]
}

然后在module.json5中引用这些变量:

"splashScreen": {
  "backgroundColor": "$color:splash_background",
  "textColor": "$color:splash_text"
}

对于暗黑模式,在resources/dark/element/color.json中定义暗色值:

{
  "color": [
    {
      "name": "splash_background",
      "value": "#121212"
    },
    {
      "name": "splash_text",
      "value": "#FFFFFF"
    }
  ]
}

4. 高级配置与优化技巧

4.1 启动时间优化

关键时间节点监控 :通过@ohos.hiviewdfx.hiTrace模块记录启动各阶段耗时:

import hiTrace from '@ohos.hiviewdfx.hiTrace'

onWindowStageCreate(windowStage: window.WindowStage) {
    hiTrace.startTrace('splash_screen', 1000)
    windowStage.loadContent('pages/Splash', () => {
        hiTrace.finishTrace('splash_screen')
        // ...后续初始化
    })
}

资源预加载策略 :在启动页显示期间并行加载关键资源:

async preloadCriticalResources() {
    const preloadList = [
        'pages/Main',
        'resources/base/media/home_bg.jpg',
        '@ohos.multimodalInput.inputEventClient'
    ]
    
    await Promise.all(preloadList.map(resource => {
        return new Promise((resolve) => {
            // 实际预加载逻辑
            setTimeout(resolve, 300)
        })
    }))
}

4.2 内存优化方案

大图处理技巧 :对于高分辨率启动图,建议:

  1. 使用.webp格式替代.png(可减少30%-70%体积)
  2. 按设备分辨率提供多套资源
  3. 显示后立即释放资源:
onWindowStageCreate(windowStage: window.WindowStage) {
    windowStage.loadContent('pages/Splash', () => {
        // 显示2秒后跳转
        setTimeout(() => {
            windowStage.setUIContent('pages/Main')
            // 强制GC(慎用)
            globalThis.gc()
        }, 2000)
    })
}

组件懒加载 :将非必要组件延迟到主页加载:

// module.json5
"abilities": [{
  "name": "MainAbility",
  "resourcesLoading": "lazy"  // 启用懒加载
}]

4.3 常见问题排查

启动页不显示 可能的原因:

  1. 图片路径错误或尺寸过大
  2. module.json5配置项拼写错误
  3. 设备存储空间不足

解决方案:

# 检查资源文件是否存在
hdc shell ls /data/app/el1/bundle/<your_package>/resources/base/media/

# 查看日志
hdc shell hilog | grep Splash

启动白屏时间过长 优化步骤:

  1. 使用DevEco Studio的Profiler工具分析启动过程
  2. 检查是否有同步阻塞操作
  3. 将耗时任务移至后台线程:
import taskpool from '@ohos.taskpool'

@Concurrent
function heavyTask() {
    // 耗时初始化
}

taskpool.execute(heavyTask).then(() => {
    // 任务完成
})

5. 设计规范与最佳实践

5.1 华为设计规范要点

根据华为鸿蒙应用设计规范(HAG),启动页应遵循:

  • 显示时间不超过3秒(理想值1.5-2秒)
  • 保持品牌一致性(使用官方Logo和标准色)
  • 避免包含版本号等易变信息
  • 不允许添加第三方广告
  • 适配所有屏幕比例(16:9, 18:9, 19.5:9等)

推荐的设计工具:

  1. 使用Sketch或Figma的鸿蒙设计模板
  2. 通过DevEco Studio的预览功能实时查看效果
  3. 华为提供的品牌资产打包工具(Brand Asset Kit)

5.2 跨版本兼容方案

针对不同鸿蒙API版本,推荐使用条件编译:

// 检查API版本
const systemVersion = parseInt(deviceInfo.osFullName.split(' ')[2])

if (systemVersion >= 8) {
    // HarmonyOS 4.0+ 新API
    windowStage.setUIContent('pages/SplashV2')
} else {
    // 旧版本兼容模式
    windowStage.loadContent('pages/SplashV1')
}

对于必须使用的API新特性,应在package.json中声明最低版本要求:

"abilities": [{
  "name": "MainAbility",
  "apiVersion": {
    "compatible": 8,
    "target": 9,
    "releaseType": "Release"
  }
}]

5.3 A/B测试方案

通过华为分析服务(HMS Analytics Kit)实现启动页效果测试:

import analytics from '@ohos.analytics'

// 随机分配测试组
const splashVariant = Math.random() > 0.5 ? 'A' : 'B'

// 记录显示事件
analytics.onEvent('splash_show', {
    variant: splashVariant,
    duration: 2000
})

// 记录转化事件
analytics.onEvent('splash_conversion', {
    variant: splashVariant,
    entry: 'main_page'
})

在AppGallery Connect后台配置指标分析:

  1. 启动页到主页的转化率
  2. 不同版本的留存率对比
  3. 用户行为热力图分析

6. 实战案例:电商应用启动页优化

6.1 原始实现分析

某电商应用初始启动页实现存在以下问题:

  • 静态图片尺寸过大(1.8MB)
  • 同步加载所有商品分类数据
  • 未适配折叠屏设备
  • 平均显示时间2.8秒

通过DevEco Studio性能分析发现:

  • 图片解码耗时420ms
  • 数据同步加载阻塞680ms
  • 主线程IO等待时间过长

6.2 优化实施步骤

第一阶段:资源优化

  1. 将splash.png转换为webp格式(体积降至540KB)
  2. 为不同DPI设备提供多套资源
  3. 添加折叠屏专属布局

第二阶段:加载逻辑重构

async onWindowStageCreate(windowStage: window.WindowStage) {
    // 并行执行
    await Promise.all([
        this.loadSplashImage(),
        this.initSDK(),
        taskpool.execute(this.preloadCatalog)
    ])
    
    // 显示优化后的启动页
    windowStage.loadContent('pages/NewSplash', () => {
        hiTrace.finishTrace('cold_start')
    })
}

第三阶段:效果验证

  • 平均显示时间降至1.2秒
  • 冷启动崩溃率下降37%
  • 首屏渲染速度提升52%

6.3 关键代码片段

图片懒加载实现

class SplashPage {
    @State splashImage: Resource = $r('app.media.placeholder')
    
    aboutToAppear() {
        loadImageAsync('resources/base/media/splash.webp').then(img => {
            this.splashImage = img
        })
    }
}

折叠屏适配逻辑

import display from '@ohos.display'

const displayInfo = display.getDefaultDisplay()
if (displayInfo.width >= 1280 && displayInfo.height >= 1280) {
    this.isFoldable = true
    this.splashLayout = 'resources/foldable/layout/splash.json'
}

经过三个迭代周期的优化,该电商应用的启动页体验评分从3.2提升至4.7(5分制),有效提升了用户留存率。这个案例表明,合理的启动页设计和实现能显著改善应用的第一印象。在实际项目中,建议持续监控启动性能指标,建立基线标准并定期优化。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐