Android 执行顺序firebase auth

Android 执行顺序firebase auth,android,authentication,firebase,firebase-authentication,Android,Authentication,Firebase,Firebase Authentication,我正在尝试使用firebase身份验证和facebook sdk以及android中的“用户/密码”选项登录。我需要知道用户在启动MainActivity之前使用了哪种身份验证 几天前,代码正常工作,但我不得不删除firebase项目。今天我配置了firebase/facebook sdk,它可以正常工作。但是现在代码的执行顺序不同了(我知道这很奇怪) 在此之前,先执行onComplete方法(当我验证任务是否成功时),然后执行onAuthStateChanged。但是现在首先执行onAuthS

我正在尝试使用firebase身份验证和facebook sdk以及android中的“用户/密码”选项登录。我需要知道用户在启动MainActivity之前使用了哪种身份验证

几天前,代码正常工作,但我不得不删除firebase项目。今天我配置了firebase/facebook sdk,它可以正常工作。但是现在代码的执行顺序不同了(我知道这很奇怪)

在此之前,先执行
onComplete
方法(当我验证任务是否成功时),然后执行
onAuthStateChanged
。但是现在首先执行onAuthStateChanged方法,启动另一个活动,然后验证任务是否成功。我在调试模式下看到这种行为

下面是代码示例,我提前感谢您的帮助

fbLoginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {
            //Inicio de sesion con facebook exitoso
            handleFacebookAccessToken(loginResult.getAccessToken());
        }

        @Override
        public void onCancel() {
            //Inicio de sesion con facebook cancelado
            Toast.makeText(getApplicationContext(),R.string.cancel_fb_log,Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onError(FacebookException error) {
            //Inicio de sesion con facebook erroneo
            Toast.makeText(getApplicationContext(),R.string.error_fb_log,Toast.LENGTH_SHORT).show();
        }
    });



private void handleFacebookAccessToken(AccessToken accessToken) {
    relativeLayout.setVisibility(View.GONE);
    relativeLayout1.setVisibility(View.VISIBLE);
    AuthCredential credential = FacebookAuthProvider.getCredential(accessToken.getToken());
    //Iniciar sesión con una credencial
    firebaseAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
        //metodo que se ejecuta al terminar el proceso
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if (!task.isSuccessful()){
                //Ocurrio un error al realizar el logueo a firebase con facebook
                Utilities.exceptionFirebaseAdministrator(LoginActivity.this, task, LOG_TAG);
                LoginManager.getInstance().logOut();
            }else{
                pref.edit().putBoolean(getString(R.string.pref_logged_with_facebook),true).apply();
                pref.edit().putBoolean(getString(R.string.pref_logged_with_firebase),false).apply();
            }
            relativeLayout.setVisibility(View.VISIBLE);
            relativeLayout1.setVisibility(View.GONE);
        }
    });
}

fireAuthStateListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();

            if(user != null){

//I try use SharedPreference and validate if is facebook login or other
                    startMainActivity();

            }

        }
    };

@Override
public void onStart() {
    super.onStart();
    //Cuando la clase empieza a "escuchar"
    firebaseAuth.addAuthStateListener(fireAuthStateListener);
}

@Override
public void onStop() {
    super.onStop();
    //Cuando la clase deja de "escuchar"
    firebaseAuth.removeAuthStateListener(fireAuthStateListener);
}
fbLoginButton.registerCallback(callbackManager,new FacebookCallback()){
@凌驾
成功时公共无效(LoginResult LoginResult){
//在facebook exitoso网站上发布
handleFacebookAccessToken(loginResult.getAccessToken());
}
@凌驾
公开作废{
//伊尼西奥·德塞西翁
Toast.makeText(getApplicationContext(),R.string.cancel\u fb\u log,Toast.LENGTH\u SHORT).show();
}
@凌驾
public void onError(facebook异常错误){
//埃罗尼奥监狱
Toast.makeText(getApplicationContext(),R.string.error\u fb\u log,Toast.LENGTH\u SHORT).show();
}
});
私有无效handleFacebookAccessToken(AccessToken AccessToken){
relativeLayout.setVisibility(View.GONE);
relativeLayout1.setVisibility(View.VISIBLE);
AuthCredential credential=FacebookAuthProvider.getCredential(accessToken.getToken());
//联合国秘书处
firebaseAuth.signInWithCredential(凭证).addOnCompleteListener(这是新的OnCompleteListener(){
//我的目的地是终点站
@凌驾
未完成的公共void(@NonNull任务){
如果(!task.issusccessful()){
//Ocurrio un error al Realizer el logueo a firebase con facebook
Utilities.ExceptionFileBaseAAdministrator(LoginActivity.this、task、LOG_标记);
LoginManager.getInstance().logOut();
}否则{
pref.edit().putBoolean(getString(R.string.pref_logged_with_facebook),true);
pref.edit().putBoolean(getString(R.string.pref_logged_with_firebase),false);
}
relativeLayout.setVisibility(View.VISIBLE);
relativeLayout1.setVisibility(View.GONE);
}
});
}
fireAuthStateListener=新的FirebaseAuth.AuthStateListener(){
@凌驾
AuthStateChanged上的公共void(@NonNull FirebaseAuth FirebaseAuth){
FirebaseUser=firebaseAuth.getCurrentUser();
如果(用户!=null){
//我尝试使用SharedReference并验证是facebook登录还是其他登录
开始不活动();
}
}
};
@凌驾
public void onStart(){
super.onStart();
//“埃斯库查”酒店
firebaseAuth.addAuthStateListener(fireAuthStateListener);
}
@凌驾
公共void onStop(){
super.onStop();
//“埃斯库查尔”酒店
firebaseAuth.removeAuthStateListener(fireAuthStateListener);
}

FirebaseAuth做了一件棘手的工作,当您启动应用程序时,FireBaseAuthStateListener首先执行以查找任何状态更改,即用户是否登录或注销。
在代码中,您在启动时添加了AuthStateListener,这就是为什么每次应用程序启动时,它都会覆盖其他方法并首先执行AuthStateListener。 在启动时将AuthStateListener添加到中,并在停止时将其删除始终是一种良好的做法,firebase工程师也推荐这种方法。 在需要用户身份验证的应用程序中,始终检查用户状态,然后执行与他们相关的任何任务,这样做是正确的

     Override
    public void onStart() {
super.onStart();
//Cuando la clase empieza a "escuchar"
firebaseAuth.addAuthStateListener(fireAuthStateListener);

}

FirebaseAuth做了一项棘手的工作,当您启动应用程序时,firebase AuthStateListener首先执行以查找任何状态更改,即用户是否登录或注销。
在代码中,您在启动时添加了AuthStateListener,这就是为什么每次应用程序启动时,它都会覆盖其他方法并首先执行AuthStateListener。 在启动时将AuthStateListener添加到中,并在停止时将其删除始终是一种良好的做法,firebase工程师也推荐这种方法。 在需要用户身份验证的应用程序中,始终检查用户状态,然后执行与他们相关的任何任务,这样做是正确的

     Override
    public void onStart() {
super.onStart();
//Cuando la clase empieza a "escuchar"
firebaseAuth.addAuthStateListener(fireAuthStateListener);

}在代码中执行此操作

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        // this is the login layout change it to yours.
    setContentView(R.layout.activity_login);

    // START initialize_auth
    mAuth = FirebaseAuth.getInstance();
    // START auth_state_listener
    mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
              //check if user is  not null 
            if (user != null) {

// below code will triggers as soon as your facebook login task is successful                   


      // this will return provider as facebook,google,twitter,email ,etc

                String provider = user.getProviders().get(0) ;

                  pref.edit().putBoolean(getString(R.string.pref_logged_with_facebook), true).apply();
                  pref.edit().putBoolean(getString(R.string.pref_logged_with_firebase), false).apply();
  //I try use SharedPreference and validate if is facebook login or other
                startMainActivity();


            } else {
                // User is signed out
                Log.d(LOG_TAG, "user signed_out");
                // logout user and open login page .
            }
        }
    };


}

// [START on_start_add_listener]
@Override
public void onStart() {
    super.onStart();
    mAuth.addAuthStateListener(mAuthListener);
}

// [START on_stop_remove_listener]
@Override
public void onStop() {
    super.onStop();
    if (mAuthListener != null) {
        mAuth.removeAuthStateListener(mAuthListener);
    }
}


private void handleFacebookAccessToken(AccessToken accessToken) {
    relativeLayout.setVisibility(View.GONE);
    relativeLayout1.setVisibility(View.VISIBLE);
    AuthCredential credential = FacebookAuthProvider.getCredential(accessToken.getToken());
    //Iniciar sesión con una credencial
    firebaseAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
        //metodo que se ejecuta al terminar el proceso
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if (!task.isSuccessful()) {

                // If sign in fails, log message or go back to login page.         
                //If sign in succeeds the auth state listener will be  
               //notified and logic to handle the
              // signed in user can be handled in the listener.

                Utilities.exceptionFirebaseAdministrator(LoginActivity.this, task, LOG_TAG);
                LoginManager.getInstance().logOut();
            }
              // this will execute no matter whats happens ,
            relativeLayout.setVisibility(View.VISIBLE);
            relativeLayout1.setVisibility(View.GONE);
        }
    });
}

} 
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//这是登录布局,请将其更改为您的。
setContentView(R.layout.activity\u登录);
//开始初始化身份验证
mAuth=FirebaseAuth.getInstance();
//启动身份验证状态侦听器
mAuthListener=new FirebaseAuth.AuthStateListener(){
@凌驾
AuthStateChanged上的公共void(@NonNull FirebaseAuth FirebaseAuth){
FirebaseUser=firebaseAuth.getCurrentUser();
//检查用户是否为空
如果(用户!=null){
//以下代码将在您的facebook登录任务成功后立即触发
//这将以facebook、google、twitter、电子邮件等形式返回提供商
字符串提供程序=user.getProviders().get(0);
pref.edit().putBoolean(getString(R.string.pref_logged_with_facebook),true);
pref.edit().putBoolean(getString(R.string.pref_logged_with_firebase),false);
//我尝试使用SharedReference并验证是facebook登录还是其他登录
开始不活动();
}否则{
//用户i