You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native集成Android原生启动屏:setKeepOnScreenCondition仍自动关闭

问题诊断

出现黑屏和动画异常的核心原因有两个:

  1. React Native 内容未就绪时启动屏提前退出:当setKeepOnScreenCondition { false }触发时,React Native的根视图还没完成渲染,此时postSplashScreenTheme对应的窗口没有可显示内容,导致短暂黑屏。
  2. 退出动画触发时机与启动屏保留逻辑冲突:系统会在满足默认条件时提前触发setOnExitAnimationListener,但此时setKeepOnScreenCondition { true }强制保留启动屏,导致动画在后台执行,直到条件变为false才会显示剩余部分。
解决方案

1. 调整MainActivity代码逻辑

确保在React Native完全初始化、根视图渲染完成后再关闭启动屏,同时修正动画执行逻辑:

class MainActivity : ReactActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        val splashScreen: SplashScreen = installSplashScreen()
        var isRnReady = false

        splashScreen.apply {
            setKeepOnScreenCondition { !isRnReady }
            setOnExitAnimationListener { splashScreenView ->
                // 实现启动屏淡出动画,确保可见且流畅
                splashScreenView.animate()
                    .alpha(0f)
                    .setDuration(300)
                    .withEndAction {
                        splashScreenView.remove()
                    }
                    .start()
            }
        }

        // 监听React Native初始化完成事件
        reactInstanceManager.addReactInstanceEventListener(object : ReactInstanceManager.ReactInstanceEventListener {
            override fun onReactContextInitialized(context: ReactContext) {
                // 延迟确保根视图渲染完成
                Handler(Looper.getMainLooper()).postDelayed({
                    isRnReady = true
                }, 200)
            }
        })

        super.onCreate(savedInstanceState)
    }

    override fun getReactInstanceManager(): ReactInstanceManager {
        return (application as MainApplication).reactNativeHost.reactInstanceManager
    }
}

2. 优化样式配置消除黑屏

在AppTheme中添加与启动屏一致的背景色,填补启动屏退出后RN视图未就绪的间隙:

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    <item name="android:editTextBackground">@drawable/rn_edit_text_material</item>
    <!-- 同步启动屏背景色,避免黑屏 -->
    <item name="android:windowBackground">@color/splashscreen_background</item>
</style>

3. 适配InitLoadingManager逻辑(若需保留)

如果必须依赖InitLoadingManager判断初始化完成,需确保回调时机在RN视图就绪之后:

lateinit var onInitLoadingFinishedHandler: () -> Unit

onInitLoadingFinishedHandler = {
    Handler(Looper.getMainLooper()).postDelayed({
        isRnReady = true
        InitLoadingManager.removeListener { onInitLoadingFinishedHandler() }
    }, 300)
}

InitLoadingManager.addListener { onInitLoadingFinishedHandler() }
关键说明
  • setKeepOnScreenCondition { !isRnReady }:用布尔变量直接控制启动屏保留状态,避免闭包逻辑陷阱
  • 动画中必须调用splashScreenView.remove():确保动画结束后启动屏视图被正确清理
  • 同步窗口背景色:彻底消除启动屏与RN视图切换时的视觉断层

内容的提问来源于stack exchange,提问作者Zukuan JING

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:57:23