Firebase身份验证,MainActivity将自己调用onBackPressed

时间:2016-11-22 09:59:13

标签: android firebase firebase-authentication

我目前正在尝试使用Android中的Firebase了解身份验证。目前,身份验证本身就像魅力一样。如果用户成功进行身份验证,我会调用LoginActivityMainActivity

这是我的LoginActivity

private static final String TAG = "LoginActivity";
EditText mEmailEdit;
EditText mPasswordEdit;
Button msignInButton;
TextView _signupLink;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);

    mAuth = FirebaseAuth.getInstance();

    mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null) {
                Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                intent.putExtra("userID", user.getUid());
                startActivity(intent);
                finish();
                Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
            } else {
                Log.d(TAG, "onAuthStateChanged:signed_out");
            }
        }
    };

    mEmailEdit = (EditText) findViewById(R.id.input_email);
    mPasswordEdit = (EditText) findViewById(R.id.input_password);

    msignInButton = (Button) findViewById(R.id.btn_login);
    msignInButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (validate(mEmailEdit.getText().toString(), mPasswordEdit.getText().toString())) {
                mAuth.signInWithEmailAndPassword(mEmailEdit.getText().toString(), mPasswordEdit.getText().toString()).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (mAuth.getCurrentUser() != null) {
                            Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                            intent.putExtra("userid", mAuth.getCurrentUser().getUid());
                            startActivity(intent);
                            finish();
                        }
                    }
                });
            }
        }
    });
}
@Override
public void onBackPressed() {
    // disable going back to the MainActivity
    moveTaskToBack(true);
}

public boolean validate(String email, String password) {
    boolean valid = true;

    if (email.isEmpty() || !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
        mEmailEdit.setError("Email is not valid");
        valid = false;
    } else {
        mEmailEdit.setError(null);
    }

    if (password.isEmpty() || password.length() < 4 || password.length() > 10) {
        mPasswordEdit.setError("between 4 and 10 alphanumeric characters");
        valid = false;
    } else {
        mPasswordEdit.setError(null);
    }

    return valid;
}

@Override
public void onStart() {
    super.onStart();
    mAuth.addAuthStateListener(mAuthListener);
}

@Override
public void onStop() {
    super.onStop();
    if (mAuthListener != null) {
        mAuth.removeAuthStateListener(mAuthListener);
    }
}

这是我的MainActivity

private FirebaseAuth mAuth;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    mAuth = FirebaseAuth.getInstance();

    Button button = (Button) findViewById(R.id.logout);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mAuth.signOut();
            Intent intent = new Intent(MainActivity.this, LoginActivity.class);
            startActivity(intent);
            finish();
        }
    });
}

所以我的问题是,在用户成功进行身份验证并调用MainActivity之后,如果我按回关闭应用程序或返回我的主屏幕。会发生什么是MainActivity再次召唤自己。因此,在我看到另一个MainActivity弹出后再按回来。在我再次按下新的后,它最终关闭并返回主屏幕或之前的任何应用程序。

我通过将android:launchMode="singleInstance"添加到manifest的{​​{1}}标记中的activity来解决此问题,但我仍然不知道MainActivity的原因当MainActivity未设置时我再次调用自己,我真的想要理解它。

另一方面,我也非常想知道AuthStateListener的用途。我不明白为什么我的申请需要这个。当用户登录时,我android:launchMode finish();LoginActivity事件永远不会被调用。我使用它是错误的还是实际上没用?

提前致谢!

2 个答案:

答案 0 :(得分:0)

按下后,将调用LoginActivity。但是,由于您仍然登录到Firebase,因此AuthStateListener将使用用户!= null触发,因此将再次调用主活动。根据您是否希望用户每次登录,您应该覆盖MainActivity中的onBackPressed()并调用firebase注销函数。

firebase登录会在应用程序的启动/重新启动过程中持续存在,authstatelistener会处理此问题。

答案 1 :(得分:0)

试试这个......

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}