避免白屏-不使用SplashScreen
除了使用 Android 12+ 引入的 SplashScreen API,你还可以通过以下 传统方式(兼容 Android 低版本)来避免启动白屏现象:
✅ 一、使用自定义启动主题(最常见做法)
让系统在 App 界面未绘制前,展示自定义背景或 logo,而不是默认白色背景。
示例:
<!-- res/values/styles.xml -->
<style name="AppTheme.Launch" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/splash_background</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowFullscreen">true</item>
</style>
<!-- res/drawable/splash_background.xml -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/white"/>
<item>
<bitmap
android:gravity="center"
android:src="@drawable/ic_logo"/>
</item>
</layer-list>
<!-- AndroidManifest.xml -->
<activity
android:name=".MainActivity"
android:theme="@style/AppTheme.Launch">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
📌 启动后替换为正常主题:
override fun onCreate(savedInstanceState: Bundle?) {
// 恢复为正式主题
setTheme(R.style.AppTheme)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
✅ 二、减小首帧时间,快速首屏绘制
即便你设置了启动图,如果首屏绘制太慢,白屏问题依旧严重。
优化点包括:
• ❌ 避免在 Application 或 MainActivity.onCreate() 中执行耗时操作;
• ✅ 启动页延后加载网络、数据库或图片;
• ✅ 延迟使用复杂自定义 View 或动画;
• ✅ 使用 ViewStub 或 ConstraintLayout 优化首屏布局;
• ✅ 开启 android:hardwareAccelerated=”true” 加快绘制;
✅ 三、使用 Window.setBackgroundDrawable() 提前手动设置背景(替代主题)
适用于运行时动态设置启动背景:
override fun onCreate(savedInstanceState: Bundle?) {
// 提前设置背景,避免默认白屏
window.setBackgroundDrawableResource(R.drawable.splash_background)
// 设置正式主题
setTheme(R.style.AppTheme)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
✅ 四、使用 LaunchActivity + Handler 跳转(不推荐)
老项目中常见做法:用一个独立的 SplashActivity 承载 logo 或广告页。
问题:
• 增加启动耗时;
• 跳转视觉不自然;
• 用户可能注意到“页面跳转”的闪动。
🔚 总结
方法 | 优点 | 缺点 |
---|---|---|
✅ 自定义启动主题 | 简单、无跳转、过渡平滑 | 需小心资源大小和兼容性 |
✅ SplashScreen API(Android 12+) | 官方推荐,过渡自然 | 仅支持 Android 12+ |
🚫 启动 Activity + Handler 跳转 | 可展示广告、逻辑清晰 | 跳转明显、增加延迟 |
✅ 提前设置背景或缩短初始化时间 | 实用、兼容性好 | 需良好代码结构 |