Android 12(API 31/32)中Splash Screen API异常问题求助
问题分析
从设置应用启动属于系统触发的特殊启动场景,官方将API31/32下的闪屏回调异常标注为预期行为,但该逻辑与开发者的常规预期不符,导致闪屏无图标、页面卡死等问题。
修复方案
- 特殊启动场景判断适配
通过Intent参数判断是否从非启动器场景启动,跳过依赖splashScreen.setOnExitAnimationListener的动画逻辑,直接跳转主页面:override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val isLaunchedFromNonLauncher = intent?.run { action == Intent.ACTION_MAIN && categories?.contains(Intent.CATEGORY_LAUNCHER) != true } ?: false if (isLaunchedFromNonLauncher) { startActivity(Intent(this, MainActivity::class.java)) finish() return } // 正常启动场景的闪屏动画逻辑 splashScreen.setOnExitAnimationListener { view -> view.animate() .alpha(0f) .setDuration(500) .withEndAction { view.remove() startActivity(Intent(this, MainActivity::class.java)) finish() } .start() } } - 升级AndroidX SplashScreen库
将androidx.core:core-splashscreen依赖升级至1.0.1及以上版本,后续版本针对该特殊启动场景做了兼容性优化,可减少回调异常或不触发的情况。
临时解决办法
- 强制触发冷启动
若判断为异常启动场景,重新发起冷启动意图,绕过系统的特殊启动逻辑:if (isLaunchedFromNonLauncher) { packageManager.getLaunchIntentForPackage(packageName)?.let { launchIntent -> launchIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK) startActivity(launchIntent) } finish() return } - API31/32单独降级闪屏实现
针对这两个版本放弃AndroidX SplashScreen库,使用传统的静态布局闪屏:override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (Build.VERSION.SDK_INT in 31..32) { setContentView(R.layout.layout_traditional_splash) Handler(Looper.getMainLooper()).postDelayed({ startActivity(Intent(this, MainActivity::class.java)) finish() }, 1000) return } // 其他版本正常使用AndroidX SplashScreen逻辑 splashScreen.setOnExitAnimationListener { /* ... */ } }
内容的提问来源于stack exchange,提问作者Saul
相关产品推荐
相关产品推荐

