应用启动时如何校验Firebase中用户登录信息是否有效
Firebase启动登录态校验跳转实现修正
你当前的代码存在语法错误、内存泄漏风险、逻辑不严谨三类问题,以下是可直接运行的修正方案:
原有代码的问题点
- 语法错误:else分支的
Handler.postDelayed闭包未正确闭合,无法通过编译 - 内存泄漏:无参构造的主线程Handler会持有Activity引用,若3秒延迟期间用户主动退出启动页,回调执行时会触发崩溃或内存泄漏
- 逻辑缺陷:仅判断
auth.currentUser是否为空只能校验本地是否有缓存凭证,无法识别账号被禁用、凭证过期的无效场景 - 冗余代码:两个分支的延迟跳转逻辑重复,可合并简化
正确实现代码
首先在启动页(SplashActivity)中声明全局的Handler和回调引用,和页面生命周期绑定避免泄漏:
class SplashActivity : AppCompatActivity() { private lateinit var auth: FirebaseAuth private val mainHandler = Handler(Looper.getMainLooper()) private val jumpRunnable = Runnable { // 页面已销毁时不再执行跳转,避免崩溃 if (isFinishing || isDestroyed) return@Runnable val targetActivity = if (isUserLoginValid()) { MainActivity::class.java } else { SignUp::class.java } startActivity(Intent(this, targetActivity)) finish() // 不需要过渡动画可以加下面这行 // overridePendingTransition(0, 0) } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_splash) auth = FirebaseAuth.getInstance() // 延迟3秒跳转,给启动页品牌展示留时间 mainHandler.postDelayed(jumpRunnable, 3000) } /** * 校验登录态有效性 */ private fun isUserLoginValid(): Boolean { val currentUser = auth.currentUser ?: return false // 如果业务要求必须验证邮箱才能进主页,放开下面这行注释即可 // return currentUser.isEmailVerified // 常规场景下Firebase SDK会自动清空失效的本地缓存凭证,直接返回true即可 return true } override fun onDestroy() { // 页面销毁时移除所有待执行回调,彻底杜绝内存泄漏 mainHandler.removeCallbacks(jumpRunnable) super.onDestroy() } }
补充说明
- 如果不需要展示启动品牌页,可以直接去掉
postDelayed延迟逻辑,在onCreate里判断后立即跳转,启动速度更快 - 如果有强安全校验需求(比如需要实时检测账号是否被后台封禁),可以在判断逻辑里额外调用
currentUser.getIdToken(true)强制拉取服务端最新凭证,刷新成功再跳主页,失败则跳注册页,注意这个是网络请求,需要搭配loading状态避免用户无响应 - 跳转逻辑不要放在Application类中实现,必须依托Activity上下文执行,否则会抛出上下文异常
内容的提问来源于stack exchange,提问作者Victor kiptoo
相关产品推荐
相关产品推荐

