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

关于LoginActivity单次显示及SharedPreference毕设放置位置的技术问询

解决LoginActivity仅在未登录时显示的问题

嘿,我完全懂你现在的困扰——想让登录页面只在用户第一次打开或者未登录状态下出现,却摸不准SharedPreference代码该放哪儿,试了网上的方法也没效果对吧?别慌,咱们一步步来搞定这个问题。

核心思路:在LoginActivity启动前先检查登录状态

你需要做的是在LoginActivity加载布局之前,就完成登录状态的判断。这样如果用户已经登录,直接跳转到主界面,根本不会让登录页显示出来,体验更顺畅。

修改后的代码示例

我把需要添加的代码标注出来了,你可以直接参考:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // --- 新增:登录状态检查(放在setContentView之前!)---
    // 获取SharedPreference实例,"UserPrefs"是自定义的存储文件名
    SharedPreferences sharedPref = getSharedPreferences("UserPrefs", MODE_PRIVATE);
    boolean isLoggedIn = sharedPref.getBoolean("isLoggedIn", false);
    
    // 结合Firebase Auth验证当前用户(双重保险,避免本地存储被篡改)
    FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
    
    // 如果已登录,直接跳转主界面并结束当前页面
    if (isLoggedIn && currentUser != null) {
        Intent intent = new Intent(LoginActivity.this, userInterface.class);
        startActivity(intent);
        finish();
        return; // 终止后续代码执行,不用加载登录页布局
    }
    // --- 新增代码结束 ---

    setContentView(R.layout.activity_login);
    auth = FirebaseAuth.getInstance();
    progressBar = findViewById(R.id.prgBar);
    btnLogin = findViewById(R.id.user_login);
    userEmail = findViewById(R.id.user_email);
    userPwd = findViewById(R.id.user_password);
    btnReg = findViewById(R.id.user_reg);

    btnReg.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(LoginActivity.this, RegisterActivity.class));
        }
    });

    btnLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String email = userEmail.getText().toString();
            final String password = userPwd.getText().toString();

            if (TextUtils.isEmpty(email)) {
                Toast.makeText(getApplicationContext(), "Enter email address!", Toast.LENGTH_SHORT).show();
                return;
            }
            if (TextUtils.isEmpty(password)) {
                Toast.makeText(getApplicationContext(), "Enter password!", Toast.LENGTH_SHORT).show();
                return;
            }

            //authenticate user
            auth.signInWithEmailAndPassword(email, password)
                    .addOnCompleteListener(LoginActivity.this, new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            if (!task.isSuccessful()) {
                                // there was an error
                                if (password.length() < 6) {
                                    userPwd.setError(getString(R.string.minimum_password));
                                } else {
                                    Toast.makeText(LoginActivity.this, getString(R.string.auth_failed), Toast.LENGTH_LONG).show();
                                }
                            } else {
                                // --- 新增:登录成功后保存状态到SharedPreference ---
                                SharedPreferences.Editor editor = sharedPref.edit();
                                editor.putBoolean("isLoggedIn", true);
                                editor.apply(); // 异步保存,性能更好
                                // --- 新增代码结束 ---

                                Intent intent = new Intent(LoginActivity.this, userInterface.class);
                                startActivity(intent);
                                finish();
                            }
                        }
                    });
        }
    });
}

额外注意事项

  1. 退出登录时要更新状态:在主界面的退出按钮点击事件里,别忘了把SharedPreference的登录状态设为false,同时调用Firebase的退出方法:
// 示例:退出登录的代码
auth.signOut();
SharedPreferences sharedPref = getSharedPreferences("UserPrefs", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putBoolean("isLoggedIn", false);
editor.apply();
// 跳回登录页
Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
finish();
  1. 为什么结合Firebase Auth的currentUser?:SharedPreference是存在本地的,可能被用户清除或者篡改,而Firebase Auth的getCurrentUser()能实时验证用户的登录状态,双重验证让逻辑更可靠。

这样修改后,你的LoginActivity就只会在用户未登录时显示了,赶紧试试吧!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:20:10