如何根据应用自身主题修改Splash screen加载前的空白屏幕颜色
适配方案
核心逻辑
Splash加载前的空白屏本质是应用启动初始化阶段系统展示的启动窗口背景,要脱离系统主题控制、仅跟随应用内自定义主题的核心思路为:提前读取应用内保存的主题配置,在窗口加载完成前就设置对应颜色的窗口背景,强制覆盖系统主题的自动适配逻辑。
分平台实现方式
Android 端
- 首先定义两套独立的启动主题,避免使用系统
DayNight主题族,完全由应用内部逻辑控制调用:- 浅色模式启动主题(
res/values/styles.xml):
<style name="LaunchLight" parent="android:Theme.Material.Light.NoActionBar"> <item name="android:windowBackground">@color/white</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> <item name="android:statusBarColor">@color/white</item> </style>- 深色模式启动主题(
res/values-night/styles.xml):
<style name="LaunchDark" parent="android:Theme.Material.NoActionBar"> <item name="android:windowBackground">@color/black</item> <item name="android:windowDrawsSystemBarBackgrounds">true</item> <item name="android:statusBarColor">@color/black</item> </style> - 浅色模式启动主题(
- 在
Application类的onCreate方法最顶部,优先读取应用内保存的主题配置,提前设置对应启动主题:override fun onCreate() { super.onCreate() // 读取应用内存储的主题配置,0=浅色 1=深色 val appTheme = getSharedPreferences("appConfig", MODE_PRIVATE).getInt("customTheme", 0) setTheme(if(appTheme == 0) R.style.LaunchLight else R.style.LaunchDark) // 其余应用初始化逻辑 } - 启动页
Activity的onCreate中,在setContentView前不要修改窗口背景,避免出现二次闪烁。
iOS 端
- 先在
Info.plist中移除UIUserInterfaceStyle配置项,避免应用强制跟随系统主题切换。 - 在
AppDelegate的didFinishLaunchingWithOptions方法最前端,读取应用内主题配置,提前设置窗口背景:func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 读取应用内存储的深色模式开关配置 let darkModeOn = UserDefaults.standard.bool(forKey: "customDarkMode") window?.backgroundColor = darkModeOn ? .black : .white // 全局强制覆盖系统主题设置 if #available(iOS 13.0, *) { window?.overrideUserInterfaceStyle = darkModeOn ? .dark : .light } return true } LaunchScreen.storyboard的根视图背景设置为默认即可,会自动跟随窗口背景色展示。
注意事项
- 主题设置逻辑必须放在应用初始化的最早期执行,晚于系统加载启动窗口的时机就会出现异常颜色的空白屏
- 所有主题切换逻辑完全由应用内配置项控制,不要调用系统自动跟随主题的相关API,避免被系统配置覆盖自定义设置。
内容的提问来源于stack exchange,提问作者phil
相关产品推荐
相关产品推荐

