我目前正在尝试使用Android中的Firebase了解身份验证。目前,身份验证本身就像魅力一样。如果用户成功进行身份验证,我会调用LoginActivity
和MainActivity
。
这是我的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
事件永远不会被调用。我使用它是错误的还是实际上没用?
提前致谢!
答案 0 :(得分:0)
按下后,将调用LoginActivity。但是,由于您仍然登录到Firebase,因此AuthStateListener将使用用户!= null触发,因此将再次调用主活动。根据您是否希望用户每次登录,您应该覆盖MainActivity中的onBackPressed()并调用firebase注销函数。
firebase登录会在应用程序的启动/重新启动过程中持续存在,authstatelistener会处理此问题。
答案 1 :(得分:0)
试试这个......
@Override
public void onBackPressed() {
moveTaskToBack(true);
}