Android 我想摧毁启动新意图的活动

Android 我想摧毁启动新意图的活动,android,firebase,authentication,android-intent,activity-lifecycle,Android,Firebase,Authentication,Android Intent,Activity Lifecycle,我有两个活动:主要活动和注册。MainActivity是在应用程序启动并获得firebase身份验证实例时创建的,如果找不到用户,则进行注册 public class MainActivity extends AppCompatActivity { Intent intent; FirebaseAuth.AuthStateListener authStateListener; FirebaseAuth firebaseAuth; @Override protected void onCre

我有两个活动:主要活动和注册。MainActivity是在应用程序启动并获得firebase身份验证实例时创建的,如果找不到用户,则进行注册

public class MainActivity extends AppCompatActivity {

Intent intent;

FirebaseAuth.AuthStateListener authStateListener;
FirebaseAuth firebaseAuth;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Log.d("MainActivity","Created..");

    new Handler().postDelayed(() -> {

        firebaseAuth = FirebaseAuth.getInstance();

        authStateListener = firebaseAuth -> {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if(user!=null) {
                intent = new Intent(MainActivity.this, HomeScreen.class);
                Log.d("Authentication", "User already signed in..");
                intent.putExtra("state", "alreadySignIned");
                startActivity(intent);
                MainActivity.this.finish();
            }
        };

        intent = new Intent(this,signUp.class);
        startActivity(intent);
        MainActivity.this.finish();

        firebaseAuth.addAuthStateListener(authStateListener);
    },5000);
}
}

现在,当新用户在注册中注册时,它将转到主屏幕活动,但我面临的问题是,authStateListener在新用户注册时获取用户,并从MainActivity启动intent

public class signUp extends AppCompatActivity {

Intent intent;

FirebaseAuth firebaseAuth;
boolean buttonPress = false;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.signup);

    EditText emailUp,passUp,userName;
    Button signUp;
    TextView toSignIn;

    emailUp = findViewById(R.id.signUpEmail);
    passUp = findViewById(R.id.signUpPass);
    signUp = findViewById(R.id.signUpButton);
    userName = findViewById(R.id.signUpUserName);
    toSignIn = findViewById(R.id.toSignIn);

    firebaseAuth = FirebaseAuth.getInstance();

    signUp.setOnClickListener(v -> {
        buttonPress = true;
        String email = emailUp.getText().toString();
        String pass = passUp.getText().toString();
        String name = userName.getText().toString();

        if(email.isEmpty()){
            emailUp.setError("Please enter email id..");
            emailUp.requestFocus();
        } else if(pass.isEmpty()){
            passUp.setError("Please enter password..");
            passUp.requestFocus();
        } else {
            firebaseAuth.createUserWithEmailAndPassword(email,pass).addOnCompleteListener(task -> {
                if(!task.isSuccessful()){
                    Toast.makeText(signUp.this,"Sign up Unsuccessful, please try again.",Toast.LENGTH_SHORT).show();
                } else {
                    Log.d("Authentication","User signing up..");
                    intent = new Intent(this,HomeScreen.class);
                    intent.putExtra("state","signedUp");
                    intent.putExtra("name",name);
                    startActivity(intent);
                    signUp.this.finish();
                }
            });
        }
    });

}
}

这是主屏幕活动的日志

2020-05-18 14:04:33.355 29696-29696/com.example.movietracker I/BiChannelGoogleApi: [FirebaseAuth: ] getGoogleApiForMethod() returned Gms: com.google.firebase.auth.api.internal.zzaq@8f143e5
2020-05-18 14:05:04.668 29696-29711/com.example.movietracker D/FirebaseAuth: Notifying id token listeners about user ( 82Q12yEqqjUP0AWGuGoxok4pvae2 ).
2020-05-18 14:05:04.669 29696-29711/com.example.movietracker D/FirebaseAuth: Notifying auth state listeners about user ( 82Q12yEqqjUP0AWGuGoxok4pvae2 ).
2020-05-18 14:05:04.669 29696-29696/com.example.movietracker D/Authentication: User already signed in..
2020-05-18 14:05:04.734 29696-29696/com.example.movietracker D/Homescreen Activity: Created..
2020-05-18 14:05:04.734 29696-29696/com.example.movietracker D/Intent: State alreadySignIned
2020-05-18 14:05:04.771 29696-29696/com.example.movietracker D/Cursor: Count on create 0
2020-05-18 14:05:04.773 29696-29696/com.example.movietracker D/Homescreen Activity: Started..
2020-05-18 14:05:04.773 29696-29696/com.example.movietracker D/Username: Username null
2020-05-18 14:05:04.819 29696-29696/com.example.movietracker D/NetworkSecurityConfig: No Network Security Config specified, using platform default
2020-05-18 14:05:04.826 29696-29696/com.example.movietracker D/WatchList DB: Size 0
2020-05-18 14:05:04.826 29696-29696/com.example.movietracker D/WatchListID: Size 0
2020-05-18 14:05:04.838 29696-29696/com.example.movietracker D/Authentication: User signing up..
在这里,它在注册时通知authStateListener,在一些代码之后,它从注册类中获取意图。我希望它销毁MainActivity并直接从注册中获取意图,而不通知authStateListener


请帮助。

您可以销毁以下活动:

步骤1:在MainActivity中声明一个
Activity
变量

public static Activity MainActivityContext;
步骤2:初始化
MainActivityContext
中的变量
OnCreate
方法
MainActivity

MaMainActivityContext = this;
步骤3:现在转到要销毁
MainActivity
并写入的java语句

MainActivity.MainActivityContext.finish();

您可以销毁这样的活动:

步骤1:在MainActivity中声明一个
Activity
变量

public static Activity MainActivityContext;
步骤2:初始化
MainActivityContext
中的变量
OnCreate
方法
MainActivity

MaMainActivityContext = this;
步骤3:现在转到要销毁
MainActivity
并写入的java语句

MainActivity.MainActivityContext.finish();

main活动
始终启动
注册
活动
。如果用户已经存在,
主屏幕
活动
也会启动。这可能不是你想要的

另外,
authListener
回调调用
MainActivity.this.finish()
,但此时,
MainActivity
已经完成,因此这也是错误的

如果不希望在用户注册时触发
authListener
,则应在创建用户之前删除该侦听器


一般来说,您的代码可以改进。您应该阅读更多教程,以更好地了解如何执行此操作。

MainActivity
始终启动
注册
活动。如果用户已经存在,
主屏幕
活动
也会启动。这可能不是你想要的

另外,
authListener
回调调用
MainActivity.this.finish()
,但此时,
MainActivity
已经完成,因此这也是错误的

如果不希望在用户注册时触发
authListener
,则应在创建用户之前删除该侦听器


一般来说,您的代码可以改进。您应该阅读更多教程,以更好地了解如何执行此操作。

您不会将对
活动的引用存储在
静态变量中。这会导致内存泄漏,这是一种不好的做法。您没有将对
活动的引用存储在
静态变量中。这会导致内存泄漏,这是一种糟糕的做法。谢谢,我理解了这个问题。我不知道如何删除侦听器。现在我已经实现了。谢谢,我理解了这个问题。我不知道如何删除侦听器。现在我已经实现了它。