如何结合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
相关产品推荐
相关产品推荐

