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

Jetpack Compose启动屏全Android版本兼容问题求助

解决Jetpack Compose启动屏Android 12以下版本黑屏、图标过大问题

核心问题分析

Android 12+依赖系统原生Splash Screen API实现启动屏,而12以下版本无该API支持,原方案仅适配了高版本逻辑,未处理低版本的传统启动屏兼容,导致出现黑屏、图标缩放异常问题。

分步解决路径

1. 拆分高低版本主题配置

  • 低版本主题(themes.xml):
    放弃Splash Screen API相关属性,改用传统启动屏主题配置:
    <style name="Theme.App.Splash" parent="Theme.MaterialComponents.Light.NoActionBar">
        <item name="android:windowBackground">@drawable/splash_background</item>
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>
    </style>
    
    其中@drawable/splash_background是自定义的layer-list文件,用于控制图标大小和背景:
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:drawable="@color/splash_bg_color"/>
        <item>
            <bitmap
                android:gravity="center"
                android:src="@drawable/ic_app_launcher"
                android:width="120dp"
                android:height="120dp"/>
        </item>
    </layer-list>
    
  • 高版本主题(themes.xml(v31)):
    保留原生Splash Screen API配置,确保继承正确的系统主题:
    <style name="Theme.App.Splash" parent="Theme.SplashScreen">
        <item name="windowSplashScreenBackground">@color/splash_bg_color</item>
        <item name="windowSplashScreenAnimatedIcon">@drawable/ic_app_launcher</item>
        <item name="postSplashScreenTheme">@style/Theme.App.Main</item>
    </style>
    

2. 调整SplashActivity逻辑适配多版本

修改SplashActivity.kt,区分高低版本执行不同启动逻辑:

class SplashActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        // 高版本使用原生Splash Screen API
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            installSplashScreen().apply {
                setKeepOnScreenCondition {
                    // 可添加初始化完成判断逻辑,比如检查数据加载状态
                    false
                }
            }
        }
        
        // 统一跳转主页面并销毁启动页
        startActivity(Intent(this, MainActivity::class.java))
        finish()
    }
}

3. 修正Manifest配置

确保启动页和主页使用对应主题:

<activity
    android:name=".SplashActivity"
    android:theme="@style/Theme.App.Splash"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity
    android:name=".MainActivity"
    android:theme="@style/Theme.App.Main"
    android:exported="false"/>

4. 依赖配置校验

确认引入正确的Splash Screen兼容库:

dependencies {
    // 适配高版本的Splash Screen库
    implementation "androidx.core:core-splashscreen:1.0.1"
    // 其他Compose相关依赖...
}

关键注意事项

  • 低版本必须通过layer-list指定图标固定宽高,避免系统自动缩放导致图标过大
  • 低版本主题不能继承Theme.SplashScreen,该主题仅API 31+系统支持
  • 跳转主页面后必须调用finish(),避免启动页残留在返回栈中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 11:50:06