Java FireBase身份验证身份验证状态已更改

Java FireBase身份验证身份验证状态已更改,java,android,android-intent,firebase,Java,Android,Android Intent,Firebase,我希望能够根据用户的登录状态是否发生变化,将意图传递给活动 我必须在LoginActivity的OnCreate方法中遵循AuthStateListener 如果用户已登录,则我希望将其转发到MainActivity 但是,如果用户已注销,则需要转到LoginActivity 当他们注销时,问题就来了,它陷入了一个无限循环,不断地向后勤活动发起攻击 当身份验证状态更改时,是否有任何方法可以告诉用户在哪里(哪个活动)。这样,我就可以将已签出的意图调用放在if语句中,以检查它们是否已经在logina

我希望能够根据用户的登录状态是否发生变化,将意图传递给活动

我必须在LoginActivity的OnCreate方法中遵循AuthStateListener

如果用户已登录,则我希望将其转发到MainActivity

但是,如果用户已注销,则需要转到LoginActivity

当他们注销时,问题就来了,它陷入了一个无限循环,不断地向后勤活动发起攻击

当身份验证状态更改时,是否有任何方法可以告诉用户在哪里(哪个活动)。这样,我就可以将已签出的意图调用放在if语句中,以检查它们是否已经在loginacitivity中,从而防止循环

   mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null) {
                // User is signed in
                Intent intent = new Intent(getBaseContext(), MainActivity.class);
                //intent.putExtra("EXTRA_SESSION_ID", sessionId);
                startActivity(intent);
                Log.d("LOG_Login", "onAuthStateChanged:signed_in:" + user.getUid());
            } else {
                // User is signed out
                String className = this.getClass().getSimpleName();
                if (!(className == "LoginActivity")) {
                    Intent intent = new Intent(getBaseContext(), LoginActivity.class);
                    //intent.putExtra("EXTRA_SESSION_ID", sessionId);
                    startActivity(intent);
                }

                Log.d("LOG_Login", "onAuthStateChanged:signed_out");
            }
            // ...
        }
    };

最后,答案相当合乎逻辑

我将Firebase Auth调用移到了我的主活动中,并修改了流程以将意图转发给登录活动,而不是反过来。这避免了任何无限循环

mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    // User is signed in
                  //  Intent intent = new Intent(getBaseContext(), MainActivity.class);
                    //intent.putExtra("EXTRA_SESSION_ID", sessionId);
                  //  startActivity(intent);
                   // Log.d("LOG_Login", "onAuthStateChanged:signed_in:" + user.getUid());
                } else {
                    // User is signed out
                    String className = this.getClass().getName();
                    if (!(className == "LoginActivity")) {
                         Intent intent = new Intent(getBaseContext(), LoginActivity.class);
                       // intent.putExtra("EXTRA_SESSION_ID", sessionId);
                         startActivity(intent);
                    }

                    Log.d("LOG_Login", "onAuthStateChanged:signed_out");
                }
                // ...
            }
        };

        mAuth.addAuthStateListener(mAuthListener);

最后,答案相当合乎逻辑

我将Firebase Auth调用移到了我的主活动中,并修改了流程以将意图转发给登录活动,而不是反过来。这避免了任何无限循环

mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    // User is signed in
                  //  Intent intent = new Intent(getBaseContext(), MainActivity.class);
                    //intent.putExtra("EXTRA_SESSION_ID", sessionId);
                  //  startActivity(intent);
                   // Log.d("LOG_Login", "onAuthStateChanged:signed_in:" + user.getUid());
                } else {
                    // User is signed out
                    String className = this.getClass().getName();
                    if (!(className == "LoginActivity")) {
                         Intent intent = new Intent(getBaseContext(), LoginActivity.class);
                       // intent.putExtra("EXTRA_SESSION_ID", sessionId);
                         startActivity(intent);
                    }

                    Log.d("LOG_Login", "onAuthStateChanged:signed_out");
                }
                // ...
            }
        };

        mAuth.addAuthStateListener(mAuthListener);

您的
FirebaseAuth
代码是从哪个
活动运行的?如果是在LoginActivity中,则无需担心启动此活动,而是可以清除UI,例如登录字段(用户名/密码)。正在LoginActivity OnCreate中调用FirebaseAuth。但用户可以从其他活动注销。如果他们这样做了,我想将他们发送回登录屏幕。当状态更改为“已注销”时,注释出意图会导致用户保留在其当前屏幕上我认为我只需添加此AuthListener一次,还是需要为每个活动重复此AuthListener?您的
FirebaseAuth
代码是从哪个
activity
运行的?如果是在LoginActivity中,则无需担心启动此活动,而是可以清除UI,例如登录字段(用户名/密码)。正在LoginActivity OnCreate中调用FirebaseAuth。但用户可以从其他活动注销。如果他们这样做了,我想将他们发送回登录屏幕。当状态更改为“已注销”时,注释出意图会导致用户保留在当前屏幕上我认为我只需添加此AuthListener一次,还是需要为每个活动重复它?