Android 使用Firebase身份验证的正确方法是什么?
我刚刚开始使用FirebaseUI电子邮件/密码身份验证 我的应用程序非常简单,到目前为止,它由1个活动组成,使用一个TabLayout保存3个片段,如下所示:Android 使用Firebase身份验证的正确方法是什么?,android,firebase,firebase-authentication,firebaseui,Android,Firebase,Firebase Authentication,Firebaseui,我刚刚开始使用FirebaseUI电子邮件/密码身份验证 我的应用程序非常简单,到目前为止,它由1个活动组成,使用一个TabLayout保存3个片段,如下所示: public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
TabsAdapter adapter = new TabsAdapter(this, getSupportFragmentManager());
viewPager.setAdapter(adapter);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
}
}
在Firebase assistant上,它显示我需要在onStart中检查用户是否已登录:
@Override
public void onStart() {
super.onStart();
// Check if user is signed in (non-null) and update UI accordingly.
FirebaseUser currentUser = mAuth.getCurrentUser();
updateUI(currentUser);
}
然后,助手显示了如何注册和登录用户,但没有显示它应该进入活动的哪个部分:onCreate
<代码>启动
*这是注册代码:
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
Log.d(TAG, "createUserWithEmail:success");
FirebaseUser user = mAuth.getCurrentUser();
updateUI(user);
} else {
// If sign in fails, display a message to the user.
Log.w(TAG, "createUserWithEmail:failure", task.getException());
Toast.makeText(EmailPasswordActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
updateUI(null);
}
// ...
}
});
mAuth.createUserWithEmailAndPassword(电子邮件,密码)
.addOnCompleteListener(这是新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
//登录成功,使用登录用户的信息更新UI
Log.d(标记“createUserWithEmail:success”);
FirebaseUser=mAuth.getCurrentUser();
updateUI(用户);
}否则{
//如果登录失败,则向用户显示消息。
w(标记“createUserWithEmail:failure”,task.getException());
Toast.makeText(EmailPasswordActivity.this,“身份验证失败”,
吐司。长度(短)。show();
updateUI(null);
}
// ...
}
});
*这是登录代码
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
Log.d(TAG, "signInWithEmail:success");
FirebaseUser user = mAuth.getCurrentUser();
updateUI(user);
} else {
// If sign in fails, display a message to the user.
Log.w(TAG, "signInWithEmail:failure", task.getException());
Toast.makeText(EmailPasswordActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
updateUI(null);
}
// ...
}
});
mAuth.使用电子邮件和密码登录(电子邮件,密码)
.addOnCompleteListener(这是新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
//登录成功,使用登录用户的信息更新UI
Log.d(标记“signInWithEmail:success”);
FirebaseUser=mAuth.getCurrentUser();
updateUI(用户);
}否则{
//如果登录失败,则向用户显示消息。
w(标记“signInWithEmail:failure”,task.getException());
Toast.makeText(EmailPasswordActivity.this,“身份验证失败”,
吐司。长度(短)。show();
updateUI(null);
}
// ...
}
});
我很困惑,假设我现在有工作应用程序,上面提供的代码,现在的工作流程是什么?我是否需要在Mainactivity中生成此注册/登录代码,然后,而不是updateUI(null)代码>Firebase助手提供的伪代码,我应该只使用Firebase验证代码创建一个新的“主活动”,然后使用意图将用户发送到当前的主活动,该活动将重命名为类似“SignedActivity”的内容,或者在同一个当前活动中完成所有操作
**编辑:澄清我的意思:
我现在有一个主要的活动。
我是否需要:
1) 将此当前MainActivity更改为SignedActivity,然后将当前MainActivity替换为Firebase活动,然后在成功登录时将意图发送到SignedActivity
或
2) 使用Firebase代码修改当前的MainActivity,以便我仍然拥有具有Firebase额外代码的当前MainActivity
我也很困惑,所以希望我的帖子可以理解你真的应该查一下。知道何时调用回调(onCreate、onStart、onResume等),然后您可以自行决定在何处实现代码,这一点很重要
在您的情况下,我将创建一个LoginActivity,您还可以使用“createUserWithEmailAndPassword()”注册一个新的配置文件,并使用已创建的帐户登录。如果成功,您可以启动Main活动
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
Log.d(TAG, "signInWithEmail:success");
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
} else {
// If sign in fails, display a message to the user.
Log.w(TAG, "signInWithEmail:failure", task.getException());
Toast.makeText(EmailPasswordActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
}
// ...
}
});
你真的应该查一下。知道何时调用回调(onCreate、onStart、onResume等),然后您可以自行决定在何处实现代码,这一点很重要
在您的情况下,我将创建一个LoginActivity,您还可以使用“createUserWithEmailAndPassword()”注册一个新的配置文件,并使用已创建的帐户登录。如果成功,您可以启动Main活动
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
Log.d(TAG, "signInWithEmail:success");
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
} else {
// If sign in fails, display a message to the user.
Log.w(TAG, "signInWithEmail:failure", task.getException());
Toast.makeText(EmailPasswordActivity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
}
// ...
}
});
但是,如果另一个活动被定义为主活动,如何使LoginActivity首先显示?或者,主活动仍然是第一个,但是此双重检查过程将重定向到LoginActivity(通过intent),或者如果用户已登录,则将用户留在主活动中?(这就像一个“圆圈”:MainActivity>LoginActivity>MainActivity)?您可以更改将首先显示在AndroidManifest.xml中的活动。只需在您想要开始的活动下添加一个“launcher”和“main”意图过滤器。但是如果另一个活动被定义为main,如何使LoginActivity首先显示?或者,主活动仍然是第一个,但是此双重检查过程将重定向到LoginActivity(通过intent),或者如果用户已登录,则将用户留在主活动中?(这就像一个“圆圈”:MainActivity>LoginActivity>MainActivity)?您可以更改将首先显示在AndroidManifest.xml中的活动。只需在您想要开始的活动下添加一个“启动器”和“主”意图过滤器。正确处理生命周期中的所有问题并非易事。如果不仅仅是为了熟悉Firebase API,我建议使用该库。它让你的生活变得更加轻松。让生命周期中的每件事都正确并不是一件小事。如果不仅仅是为了熟悉Firebase API,我建议使用该库。它让你的生活轻松多了。