Android 使用Firebase身份验证的正确方法是什么?

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)

我刚刚开始使用FirebaseUI电子邮件/密码身份验证

我的应用程序非常简单,到目前为止,它由1个活动组成,使用一个TabLayout保存3个片段,如下所示:

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,我建议使用该库。它让你的生活轻松多了。