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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:12:21