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
相关产品推荐
相关产品推荐

