You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合Android 12 Splash Screen API加载启动数据并移除单独闪屏Activity

基于Android 12+ Splash Screen API的替换方案

首先明确你关心的核心问题:可以在数据加载完成前保持启动屏展示,该API原生支持自定义展示时长,完全可以替代独立闪屏Activity实现你的需求,不需要保留原有闪屏页面。


具体实现步骤

1. 基础依赖与主题配置

先完成Splash Screen API的基础适配,保证全版本兼容:

  • 在模块级build.gradle中引入兼容库,覆盖Android 5.0以上设备:
    implementation "androidx.core:core-splashscreen:1.0.1"
  • 按照规范配置应用启动主题,替换原有闪屏Activity的主题,主Activity的业务主题可以在SplashScreen初始化完成后再动态设置。
  • 配置完成后直接删除原有的独立闪屏Activity,同时在AndroidManifest.xml中把启动页的<intent-filter>直接设置到你的主Activity上即可。

2. 异步任务的实现位置

你原先使用的ExecutorService不需要放在Application类中,也不需要单独的页面承载,直接放在主Activity的onCreate方法中、setContentView之前执行即可,优势如下:

  • 避免在Application生命周期执行耗时任务导致的启动ANR问题,执行时机和你原有闪屏Activity的时机完全一致,不会影响业务逻辑
  • 原有加载启动数据到Application单例、billing校验的逻辑可以原封不动复用,不需要改造业务代码

3. 控制启动屏的关闭时机

核心通过setKeepOnScreenCondition方法实现启动屏的持续展示,只需要设置一个标志位控制即可,示例代码如下:

// Kotlin 实现示例
private var isAllTaskFinished = false

override fun onCreate(savedInstanceState: Bundle?) {
    // 第一步先初始化SplashScreen,必须在super.onCreate之前调用
    val splashScreen = installSplashScreen()
    super.onCreate(savedInstanceState)

    // 设置启动屏保持条件:只要任务没完成就持续展示启动屏
    splashScreen.setKeepOnScreenCondition { !isAllTaskFinished }

    // 启动ExecutorService执行后台任务,和原有逻辑完全一致
    Executors.newSingleThreadExecutor().execute {
        // 1. 加载启动数据存入Application单例
        loadPreLaunchData()
        // 2. 执行in_app_purchases的billing校验
        checkUserPurchaseStatus()
        // 所有任务完成后修改标志位,启动屏会自动关闭
        isAllTaskFinished = true
    }

    // 主Activity原有逻辑不需要修改,正常执行即可
    setContentView(R.layout.activity_main)
    // ... 其他View初始化、业务逻辑
}

Java实现逻辑完全一致,仅语法存在差异。


注意事项

  • 如果后台任务总执行时长超过5秒,系统会强制关闭启动屏,建议你对非必要启动任务做拆分,放到主Activity渲染完成后再执行,避免用户等待时间过长
  • 给billing校验逻辑增加超时处理,网络异常时不要卡住启动流程,可以先默认返回未购买状态,进入主界面后再重试校验,避免出现长时间停留在启动页的问题

内容的提问来源于stack exchange,提问作者Yasiru Nayanajith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 01:09:04