如何在Android的SplashScreen API中使用VideoView?
首先明确核心逻辑:官方SplashScreen API控制的是应用冷/温启动时系统优先展示的初始窗口,该窗口本身不支持直接嵌入VideoView这类渲染组件,我们可以通过控制系统开屏的退场时机,实现和后续VideoView播放的无缝衔接,同时兼容全Android版本,具体实现步骤如下:
第一步:引入SplashScreen兼容依赖
在模块级build.gradle的dependencies块中添加依赖:implementation "androidx.core:core-splashscreen:1.0.1"同时在
res/values/styles.xml中配置基础开屏主题,继承官方SplashScreen主题,配置基础的背景、图标属性,和你的开屏视频开头视觉保持一致即可:<style name="AppSplashTheme" parent="Theme.SplashScreen"> <item name="windowSplashScreenBackground">@color/splash_bg_color</item> <item name="windowSplashScreenAnimatedIcon">@drawable/ic_splash_logo</item> <item name="postSplashScreenTheme">@style/YourAppNormalTheme</item> </style>然后把这个主题设置给你的SplashScreenActivity,或者整个应用的
android:theme属性。第二步:调整SplashScreenActivity初始化逻辑
在Activity的onCreate方法中,先调用installSplashScreen()初始化官方开屏,再通过setKeepOnScreenCondition控制系统开屏的退场时机,直到VideoView加载完成再退出,避免衔接闪烁,原有VideoView的播放逻辑几乎不需要修改:override fun onCreate(savedInstanceState: Bundle?) { // 必须在setContentView和super.onCreate之前调用初始化SplashScreen val splashScreen = installSplashScreen() super.onCreate(savedInstanceState) // 标记VideoView是否加载完成,控制系统开屏是否退出 var isVideoPrepared = false splashScreen.setKeepOnScreenCondition { !isVideoPrepared } setContentView(R.layout.activity_splash) // 原有VideoView逻辑保持不变 val splashVideo = findViewById<VideoView>(R.id.splash_video) splashVideo.setVideoPath("android.resource://${packageName}/${R.raw.splash_ads}") splashVideo.setOnPreparedListener { mediaPlayer -> // 视频加载完成,允许系统开屏退场 isVideoPrepared = true // 按需配置播放器参数,比如静音、循环播放等 mediaPlayer.setVolume(0f, 0f) mediaPlayer.start() } splashVideo.setOnCompletionListener { // 播放完成跳转到主页面 startActivity(Intent(this@SplashScreenActivity, MainActivity::class.java)) finish() } }第三步:兼容不同Android版本体验
- Android 12及以上版本:系统会自动渲染你配置的开屏主题作为启动窗口,和后续VideoView的播放画面无缝衔接,完全符合Google的开发规范
- Android 11及以下版本:SplashScreen兼容库会自动模拟和高版本一致的启动开屏效果,不需要额外写适配代码,全版本逻辑统一
体验优化注意事项
建议把官方开屏的背景色设置为和开屏视频第一帧的背景色完全一致,如果开屏视频开头有品牌logo,也把系统开屏的图标设置为相同的logo,进一步降低过渡的感知度,体验更流畅。
注:不要尝试将VideoView直接嵌入系统提供的SplashScreenView组件中,该组件由系统管控,仅支持静态图标、动画矢量图等可序列化资源,不支持SurfaceView/TextureView/VideoView这类动态渲染组件,上述方案是Google官方推荐的视频开屏适配方式,无兼容性问题。
内容的提问来源于stack exchange,提问作者Ravikumar Mohan

