SplashScreen例子-代码简单版本

下面是一个**使用官方 Android 12+ SplashScreen API(支持向下兼容)**的完整、详细的例子,覆盖:

• 依赖配置

• 主题设置

• Kotlin 代码逻辑(包括动画、条件控制)

• 启动流程说明

目标

我们实现一个冷启动时显示 logo 动画的 splash screen,并在数据加载完成后进入主界面。

1️⃣ 添加依赖(支持 Android 6.0 到 14)

dependencies {
    implementation "androidx.core:core-splashscreen:1.0.1"
}

2️⃣ 设置主题(启动时使用特殊 splash 样式)

<!-- res/values/themes.xml -->
<style name="Theme.MyApp" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    <!-- Splash 配置 -->
    <item name="android:windowSplashScreenBackground">@color/white</item>
    <item name="android:windowSplashScreenAnimatedIcon">@drawable/ic_splash_logo</item>
    <item name="android:windowSplashScreenAnimationDuration">400</item>
    <item name="android:postSplashScreenTheme">@style/Theme.MyApp.Normal</item>
</style>

<!-- 主界面主题 -->
<style name="Theme.MyApp.Normal" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    <!-- 主界面主题 -->
</style>

注:

• @drawable/ic_splash_logo 通常使用 AnimatedVectorDrawable 或普通静态 logo;

• windowSplashScreenAnimatedIcon 居中显示;

• postSplashScreenTheme 是主界面绘制时应用的真实主题。

3️⃣ AndroidManifest.xml 配置

<application
    android:theme="@style/Theme.MyApp">
    <activity
        android:name=".MainActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
</application>

4️⃣ MainActivity.kt 示例代码

@AndroidEntryPoint // 如果你使用 Hilt,不使用可忽略
class MainActivity : AppCompatActivity() {

    private val viewModel: SplashViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        // 启用 SplashScreen(必须在 super.onCreate() 前)
        val splashScreen = installSplashScreen()

        // 设置条件:未加载完前不移除 splash
        splashScreen.setKeepOnScreenCondition {
            viewModel.isLoading.value
        }

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 其他 UI 初始化
        observeData()
    }

    private fun observeData() {
        viewModel.data.observe(this) { result ->
            // 进入主界面或展示数据
        }
    }
}

5️⃣ ViewModel 示例(模拟异步加载)

class SplashViewModel : ViewModel() {

    private val _isLoading = MutableLiveData(true)
    val isLoading: LiveData<Boolean> = _isLoading

    private val _data = MutableLiveData<String>()
    val data: LiveData<String> = _data

    init {
        // 模拟网络请求
        viewModelScope.launch {
            delay(2000)
            _data.value = "欢迎回来!"
            _isLoading.value = false
        }
    }
}

6️⃣ 显示效果结构图

|-------------------------------|
|     windowSplashScreenBG     |  <-- 背景(纯色/渐变)
|         [AnimatedIcon]       |  <-- 中间 logo(动画/静态)
|-------------------------------|

↓ finishDrawing() 触发后自动移除 ↓

|-------------------------------|
|       activity_main.xml       |
|-------------------------------|

小结:完整工作流程

阶段 行为
系统启动 App 显示 windowSplashScreenBackground + 中间 icon
installSplashScreen() 拦截主界面绘制时间
setKeepOnScreenCondition {} 控制何时隐藏 Splash
View 绘制完成 + 条件变 false 系统自动移除 Splash,进入主 UI

Bonus:支持动画的 Vector Drawable 示例

<!-- res/drawable/ic_splash_logo.xml -->
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/ic_logo">
    <target android:name="vector" android:animation="@animator/logo_fade_in" />
</animated-vector>

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器