如何在所有活动之间共享firebase登录?

时间:2017-01-24 21:58:18

标签: android firebase firebase-authentication

我正在尝试创建共享类,以便在所有活动之间访问firebase身份验证。它还必须处理创建和销毁用于身份验证的侦听器。到目前为止,我写了这个,但我不确定,这是最好的方法 - 我担心内存泄漏和确保的问题,该类已被设置并且监听器被创建和销毁。

public class User {

private static boolean loginPassed = false;
private static String userUid = null;

private static FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;

//MUST BE CALLED FROM ALL ACTIVITIES BEFORE TRY TO ACCESS GETTER/SETTER = SOURCE OF POSSIBLE ISSUES
private static void initUser()
{
    if (!loginPassed)
    {
        //FIREBASE LOGIN
        mAuth = FirebaseAuth.getInstance();
        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    // User is signed in
                    Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
                    userUid = user.getUid();
                    loginPassed = true;
                } else {
                    // User is signed out
                    Log.d(TAG, "onAuthStateChanged:signed_out");
                }
                // ...
            }
        };

        //START LISTENER
        mAuth.addAuthStateListener(mAuthListener);

        mAuth.createUserWithEmailAndPassword(email, password)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        Log.d(TAG, "createUserWithEmail:onComplete:" + task.isSuccessful());

                        // If sign in fails, display a message to the user. If sign in succeeds
                        // the auth state listener will be notified and logic to handle the
                        // signed in user can be handled in the listener.
                        if (!task.isSuccessful()) {
                            Toast.makeText(EmailPasswordActivity.this, R.string.auth_failed,
                                    Toast.LENGTH_SHORT).show();
                        }

                        // ...
                    }
                });
    }
}

public static String getUserUid() {
    return userUid;
}

public static void setUserUid(String userUid) {
    User.userUid = userUid;
}

//HOW TO STOP LISTENER AFTER USER CLOSE ALL ACTIVITIES
private static void stopListener()
{
    mAuth.removeAuthStateListener(mAuthListener);
}

}

3 个答案:

答案 0 :(得分:1)

目前还不清楚您在这里要求的确切内容,但您应用中的每个活动都可以通过自己的 if(condition) { // code... } 独立收听签名和注销事件。这是标准做法,因此当它发生时,它们都可以对该状态做出反应。

我认为尝试为这样的签名用户维护全局状态并不是一个好主意。如果一切只是使用侦听器,则可以通知他们状态的变化。你不想做任何假设。

,根据这些事件调整活动用户界面的状态。

我也不清楚为什么每次想要注销时都想创建一个新用户。创建一个新帐户应该是您控制的UI交互的一部分,因此用户可以选择他们是否登录或退出。

答案 1 :(得分:0)

目前尚不清楚您尝试做什么。让我试着阅读你的代码:

  • 检查用户是否通过了运行静态方法的登录,案例1:未通过
    • 创建AuthStateListener(),只要身份验证状态发生变化,就会记录消息
    • 启动此侦听器,侦听器说用户尚未登录
    • 现在创建一个具有电子邮件和密码的新用户,这些用户从未声明或定义过,这应该如何工作?
    • 如果创建了用户,则将loginPassed设置为true,如果没有在EmailAndPasswordActivity上向用户提供消息,则不会自动表示此活动正在运行,因为您还想从其他方法运行此方法活动
    • 这就是全部?用户在哪里注册? userId何时更改?
  • 让我们看看loginPassed为真的情况:
    • 什么。

这意味着,只要loginPassed为假,您就想要创建新用户,而不解析电子邮件和密码是不可能的。好。这意味着每次启动或重新启动应用程序时都会创建一个新用户,因为loginPassed设置为false。

您通常应该做的是:

  • 当用户想要创建新用户并告诉他他的电子邮件地址和密码时创建新用户
  • 在用户未登录时登录。每次活动需要登录用户时都会对此进行检查。这意味着你的OnAuthStateChanged监听器分别在每个活动上启动(并且停止onStop()方法)并检查用户是否已登录,如果没有,启动登录界面以通过电子邮件和密码登录监听器。
    • 如果成功登录,则重新启动打开登录界面的上一个活动。
    • 如果登录不成功,请关闭应用程序或再次询问电子邮件和密码。

不良做法将唯一用户ID保存到设备永久身份。应用程序关闭并再次重新打开后,用户仍然会登录,因此存储用户ID没有意义。您必须运行mAuth.signOut()才能退出。要获得有关如何使用firebase方法,监听器等的更多信息,请阅读Firebase文档并观看Youtube上的一些教程。尝试准确了解用户登录会话的每个部分如何以及何时启动,更改和停止以完美地使用它。

我希望我能够清楚地解释它,我希望我没有说错,我也在不断学习。

答案 2 :(得分:0)

我在应用程序单例中通过loggin用户解决了这个问题。为什么?

1)因为用户必须在整个时间内签名。

2)由活动进行的每次登录都会减慢UI响应,因为依赖操作 以前做不到。我不是在谈论1ms,而是每次活动开始时100-200毫秒,如果它在那里实施的话。

我没有保存用户密码。在Firebase加入之后,应用程序通过设计保留凭据。