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

Android Kotlin中Splash Screen API完成后按认证状态跳转页面

解决Splash Screen API完成后根据登录状态跳转页面的问题

核心问题

你当前的代码直接在onCreate中设置了登录页面布局,且setKeepOnScreenCondition { false }会让闪屏立刻消失,完全没机会执行状态判断逻辑,所以总是跳转到登录页。

修改方案

把当前Activity作为闪屏的宿主页面,不直接加载登录/注册布局,先完成登录状态判断,再在闪屏退出后跳转至对应页面。

1. 修改Activity代码

@RequiresApi(Build.VERSION_CODES.S)
override fun onCreate(savedInstanceState: Bundle?) {
    val splash = installSplashScreen()
    var isStateChecked = false
    var isUserLoggedIn = false

    // 保持闪屏直到登录状态判断完成
    splash.setKeepOnScreenCondition { !isStateChecked }

    // 执行登录状态判断(示例:从SharedPreferences读取)
    checkLoginStatus { loggedIn ->
        isUserLoggedIn = loggedIn
        isStateChecked = true // 标记状态已判断,触发闪屏退出流程
    }

    setupSplashScreen(isUserLoggedIn)
    super.onCreate(savedInstanceState)
    // 此处不再直接设置登录页面布局,转而通过跳转实现页面切换
}

@RequiresApi(Build.VERSION_CODES.S)
private fun setupSplashScreen(isUserLoggedIn: Boolean) {
    splashScreen.setOnExitAnimationListener { splashScreenView ->
        val slideUp = ObjectAnimator.ofFloat(
            splashScreenView,
            View.TRANSLATION_Y,
            0f,
            -splashScreenView.height.toFloat()
        )
        slideUp.interpolator = AnticipateInterpolator()
        slideUp.duration = 800L
        slideUp.doOnEnd { 
            splashScreenView.remove()
            // 闪屏动画结束后执行页面跳转
            navigateToTargetScreen(isUserLoggedIn)
        }
        slideUp.start()
    }
}

// 登录状态判断方法,根据你的业务逻辑实现
private fun checkLoginStatus(callback: (Boolean) -> Unit) {
    // 示例:从SharedPreferences读取登录状态
    val sharedPref = getSharedPreferences("AppPrefs", MODE_PRIVATE)
    val isLoggedIn = sharedPref.getBoolean("isLoggedIn", false)
    // 若需异步判断(如接口请求),替换为异步回调逻辑
    callback(isLoggedIn)
}

private fun navigateToTargetScreen(isUserLoggedIn: Boolean) {
    val intent = if (isUserLoggedIn) {
        // 用户已登录,跳转至主页(替换为你的主页Activity)
        Intent(this, MainActivity::class.java)
    } else {
        // 用户未登录,跳转至登录页
        Intent(this, LoginActivity::class.java)
    }
    startActivity(intent)
    finish() // 结束当前闪屏宿主Activity
}

2. 关键注意事项

  • 异步状态处理:如果登录状态需要通过网络请求获取,必须用异步回调,不能阻塞主线程,否则会引发ANR。
  • 闪屏主题保留:你原来的Theme.CustomSplashScreen配置无需修改,确保postSplashScreenTheme指向应用正常主题即可。
  • 宿主Activity无布局:闪屏宿主Activity不需要设置任何布局,它仅负责处理闪屏逻辑和页面跳转。

原代码无效原因

你设置setKeepOnScreenCondition { false }会让系统立刻结束闪屏,直接进入setContentView加载登录页面,完全跳过状态判断环节。通过将setKeepOnScreenCondition设为!isStateChecked,可以让闪屏保持显示直到完成登录状态判断,再触发闪屏退出和页面跳转。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 15:36:30