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
相关产品推荐
相关产品推荐

