Android, проверьте, была ли ранее нажата кнопка возврата в другом действии - PullRequest
0 голосов
/ 28 мая 2020

Я начал экспериментировать с Firebase и выполнил простое действие, чтобы создать учетную запись и войти в систему. У меня все работает, как ожидалось, однако я кое-что заметил, когда пользователь вошел в систему и перешел на экран меню. Если пользователь нажмет кнопку возврата на устройстве android, вы ожидаете, что приложение закроется или go вернется туда, где вы были раньше, но из-за того, что onStart () в LoginActivity, он отбрасывает пользователя обратно на страницу меню снова. Я не хочу менять метод onStart (), поскольку мне нравится, что он регистрирует вас, если у вас уже есть учетная запись. Итак, я попытался закрыть приложение при нажатии кнопки возврата в действии меню, например:

@Override
    public void onBackPressed() {
        finish();
        System.exit(0);
    }

Однако это не сработало, и я все еще не могу закрыть приложение, а затем нажав кнопку возврата в активность меню, поскольку LoginActivity все еще возвращает меня.

Это LoginActivity:

public class LoginActivity extends AppCompatActivity {

    // [START declare_auth]
    private FirebaseAuth mAuth;
    // [END declare_auth]

    private static final String TAG = "EmailPassword";

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

        // [START initialize_auth]
        // Initialize Firebase Auth
        mAuth = FirebaseAuth.getInstance();
        // [END initialize_auth]

    }

    //here we immediately check if user is already logged in then log in
    @Override
    protected void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        if (currentUser != null)
            updateUI(currentUser);
    }

    private void updateUI(FirebaseUser currentUser) {
        Intent mainIntent = new Intent(LoginActivity.this, MenuActivity.class);
        Toast.makeText(this, "This is current user: " + currentUser, Toast.LENGTH_LONG).show();
        startActivity(mainIntent);
        overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
    }


    public void createAccount(View view) {
        final EditText emailEdit = (EditText) findViewById(R.id.email_field);
        final String email = emailEdit.getText().toString();
        final EditText passwordEdit = (EditText) findViewById(R.id.password_field);
        final String password = passwordEdit.getText().toString();
        Log.d(TAG, "createAccount:" + email);

        // [START create_user_with_email]
        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 {

                            try
                            {
                                throw Objects.requireNonNull(task.getException());
                            }
                            // if user enters wrong email.
                            catch (FirebaseAuthWeakPasswordException weakPassword)
                            {
                                Log.d(TAG, "onComplete: weak_password");

                                Toast.makeText(LoginActivity.this, "Password to weak", Toast.LENGTH_LONG).show();
                            }
                            // if user enters wrong password.
                            catch (FirebaseAuthInvalidCredentialsException malformedEmail)
                            {
                                Log.d(TAG, "onComplete: malformed_email");

                                Toast.makeText(LoginActivity.this, "Wrong email", Toast.LENGTH_LONG).show();
                            }
                            catch (FirebaseAuthUserCollisionException existEmail)
                            {
                                Log.d(TAG, "onComplete: exist_email");

                                Toast.makeText(LoginActivity.this, "Email already exists", Toast.LENGTH_LONG).show();
                            }
                            catch (Exception e)
                            {
                                Log.d(TAG, "onComplete: " + e.getMessage());
                                Toast.makeText(LoginActivity.this, "Error", Toast.LENGTH_SHORT).show();
                                Toast.makeText(LoginActivity.this, "Please try again", Toast.LENGTH_SHORT).show();
                            }
                            // If sign in fails, display a message to the user.
                            Log.w(TAG, "createUserWithEmail:failure", task.getException());
                            Toast.makeText(LoginActivity.this, "Authentication failed.",
                                    Toast.LENGTH_SHORT).show();
                        }

                    }
                });
        // [END create_user_with_email]
    }

}


Есть ли способ закрыть приложение в действии меню или способ проверить метод onStart () в LoginActivity, если мы попали туда, нажав кнопку возврата на телефоне?

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Вы можете изменить свое намерение, добавив флаги Intent.FLAG_ACTIVITY_CLEAR_TASK и Intent.FLAG_ACTIVITY_NEW_TASK

 private void updateUI(FirebaseUser currentUser) {
            Intent mainIntent = new Intent(LoginActivity.this, MenuActivity.class);
            mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
            mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            Toast.makeText(this, "This is current user: " + currentUser, Toast.LENGTH_LONG).show();
            startActivity(mainIntent);
            overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
        }

Это закроет предыдущую LogicActivity, и нет необходимости переопределять onBackPressed()

0 голосов
/ 28 мая 2020

LoginActivity больше никогда не будет отображаться с кнопкой возврата. если вы снова не откроете приложение или не сделаете там намерение. Вы можете попробовать Добавить это.

<activity
   android:name=".LoginActivity"
   android:noHistory="true" />
...