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

Android应用Firebase注册未完成资料设置重启后直接进入主页问题

问题根源

Firebase 手机号认证的登录状态判定和你是否将用户资料写入实时数据库无关:只要用户输入的OTP验证码验证通过,FirebaseAuth就会在本地持久化存储当前用户的登录凭证,后续打开应用调用auth.getCurrentUser()都会返回非空结果,自然会被判定为已登录。
你当前的登录校验逻辑只判断了FirebaseAuth的登录状态,没有校验业务层的用户资料是否完成创建,就会出现你遇到的异常情况。

修复方案

1. 调整启动页校验逻辑

在应用入口(闪屏页/首个启动Activity)的登录校验环节,除了判断FirebaseAuth登录状态,额外增加一层实时数据库Users节点的存在性校验:

  • 若FirebaseAuth已登录,且Users节点下存在对应用户记录,直接跳转首页
  • 若FirebaseAuth已登录,但Users节点下无对应记录,直接跳转资料设置页
  • 若FirebaseAuth未登录,跳转手机号输入页
    参考代码:
// 闪屏页逻辑示例
FirebaseAuth auth = FirebaseAuth.getInstance();
FirebaseDatabase database = FirebaseDatabase.getInstance();

if (auth.getCurrentUser() != null) {
    String userPhone = auth.getCurrentUser().getPhoneNumber();
    database.getReference().child("Users").child(userPhone)
        .addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if (snapshot.exists()) {
                    // 资料已完善,跳首页
                    startActivity(new Intent(SplashActivity.this, MainActivity.class));
                } else {
                    // 资料未完善,跳设置页
                    startActivity(new Intent(SplashActivity.this, SetupProfileActivity.class));
                }
                finish();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                // 网络异常等情况可直接跳转登录页
                startActivity(new Intent(SplashActivity.this, LoginActivity.class));
                finish();
            }
        });
} else {
    // 未登录,跳手机号验证页
    startActivity(new Intent(SplashActivity.this, LoginActivity.class));
    finish();
}

2. 可选优化:资料设置页退出清除登录状态

如果用户在资料设置页主动退出应用,可以在退出前调用auth.signOut()清除本地的Firebase登录状态,避免下次打开重复校验。修改你现有SetupProfileActivity的onBackPressed方法即可:

@Override
public void onBackPressed() {
    if (doubleBackToExitPressedOnce) {
        // 退出前清除登录状态
        auth.signOut();
        super.onBackPressed();
        return;
    }
    this.doubleBackToExitPressedOnce = true;
    Toast.makeText(this, getString(R.string.click_again_to_Exit), Toast.LENGTH_SHORT).show();
    new Handler(Looper.getMainLooper()).postDelayed(() -> 
        doubleBackToExitPressedOnce = false, 2000);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:15:03