Firebase Realtime Database谷歌账号登出后仍自动登录原账号问题
问题原因
- 仅调用
FirebaseAuth.getInstance().signOut()只能清除Firebase侧的登录状态,Google账号的授权凭证仍保存在Google Play服务缓存中,下次触发登录时会直接读取缓存完成自动登录。 - 现有代码中的广播接收器仅在
onResume生命周期注册,没有配套解注册逻辑,存在内存泄漏风险,长时间运行可能触发系统异常。
修复方案
1. 补充Google SignIn登出逻辑
首先在Options Fragment中初始化和登录页配置一致的GoogleSignInClient实例:
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getString(R.string.default_web_client_id)) .requestEmail() .build(); GoogleSignInClient mGoogleSignInClient = GoogleSignIn.getClient(requireActivity(), gso);
修改登出点击事件,等Google登出完成后再执行页面跳转逻辑:
logoutPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { public boolean onPreferenceClick(Preference preference) { FirebaseAuth.getInstance().signOut(); // 登出Google账号,清除本地缓存的授权信息 mGoogleSignInClient.signOut() .addOnCompleteListener(requireActivity(), new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { Intent broadcastIntent = new Intent(); broadcastIntent.setAction("com.example.budgetapp.ACTION_LOGOUT"); requireActivity().sendBroadcast(broadcastIntent); requireActivity().startActivity(new Intent(requireActivity(), SignInActivity.class)); requireActivity().finish(); } }); // 如需让用户下次登录必须重新同意应用授权,可额外调用以下方法 // mGoogleSignInClient.revokeAccess(); return true; } });
注:revokeAccess方法会彻底移除应用对该Google账号的授权,下次登录时需要用户重新同意权限申请,可根据业务需求选择是否调用
2. 修复广播接收器内存泄漏问题
在MainActivity中补充广播解注册逻辑:
@Override protected void onPause() { super.onPause(); if (receiver != null) { unregisterReceiver(receiver); receiver = null; } }
调整完成后登出操作会同时清除Firebase和Google侧的登录凭证,下次触发登录时会正常弹出账号选择界面,不会自动登录之前的账号。
内容的提问来源于stack exchange,提问作者Shoji Yamada
相关产品推荐
相关产品推荐

