已登录用户跳转MainActivity时闪显SignInActivity的解决方法
问题分析
当前代码的问题在于:userAlreadyLoggedIn()里的Firestore数据请求是异步操作,主线程会跳过等待直接执行setContentView(binding.root),导致SignInActivity的界面先被渲染出来。等异步请求完成跳转MainActivity时,就会出现2秒左右的闪显现象。
解决方案
核心思路是先判断登录状态,再决定加载哪个界面,避免异步请求期间渲染SignIn的布局。可以先显示一个过渡加载界面(或短暂空白),等异步逻辑完成后再跳转或加载登录界面。
修改后的代码
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) auth = Firebase.auth val currentUser = auth.currentUser if (currentUser != null) { // 用户已登录,先显示加载布局(需提前创建简单的加载UI,比如带ProgressBar的布局) setContentView(R.layout.layout_loading) val db = FirebaseFirestore.getInstance() val userRef = db.collection(KEY_COLLECTION_USER).document(currentUser.uid) userRef.get().addOnSuccessListener { document -> if (document != null && document.exists()) { // 跳转至MainActivity,清空任务栈避免返回时再出现SignIn界面 val intent = Intent(this, MainActivity::class.java) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) startActivity(intent) finish() } else { // 用户数据不存在,加载登录界面 loadSignInLayout() } }.addOnFailureListener { // 请求失败,加载登录界面 loadSignInLayout() } } else { // 用户未登录,直接加载登录界面 loadSignInLayout() } } private fun loadSignInLayout() { binding = ActivitySignInBinding.inflate(layoutInflater) setContentView(binding.root) // 这里可以初始化登录相关的逻辑(比如按钮点击事件、输入框监听等) }
关键优化点
- 同步判断登录状态:
auth.currentUser是同步获取的,不会阻塞主线程,先快速判断用户是否已登录。 - 延迟加载登录布局:仅当用户未登录、或已登录但Firestore请求失败/数据不存在时,才加载SignInActivity的布局。
- 添加加载过渡:用加载布局替代直接显示登录界面,避免闪显,提升用户体验。
- 结束当前Activity:跳转MainActivity后调用
finish(),确保返回栈中不会残留SignInActivity。
内容的提问来源于stack exchange,提问作者Captai-N
相关产品推荐
相关产品推荐

