Android обрабатывает поведение пользователей onStop и onDestroy

У меня есть вход в систему, пользователь входит в Google+ или Facebook. Затем в следующем упражнении он выбирает пол и псевдоним, если это его первый раз в приложении (Shared Preferences). Когда пользователь нажимает кнопку "Перейти", он запускает функцию загрузки:

public void uploadUserData() {
        FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
        if (firebaseUser != null) {

            final String userUid = firebaseUser.getUid();
            final String username = editUsername.getText().toString().trim();
            final String user_class = String.valueOf(class_spinner.getSelectedItem());
            final String user_gender = String.valueOf(gender_spinner.getSelectedItem());
            FirebaseDatabase database = FirebaseDatabase.getInstance();
            DatabaseReference users = database.getReference("Users");
            users.child(userUid).child("userName").setValue(username); 

После этого пользователь больше не видит эту активность, и в его аккаунте есть вся необходимая информация.

Моя проблема заключается в том, как запретить пользователю выходить из приложения (onDestroy) без нажатия кнопки ввода. Если он это сделает, у меня не будет псевдонима, и в следующий раз, когда он откроет приложение, ему нужно имя пользователя. (Бросает нулевое исключение, очевидно).

Поток: Приветственная деятельность

if (!prefManager.isFirstTimeLaunch()) {
            launchHomeScreen();
            finish();
        }
private void launchHomeScreen() {
        startActivity(new Intent(WelcomeActivity.this, MainActivity.class));
        finish();
    }

По основному виду деятельности:

@Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                if (firebaseAuth.getCurrentUser() != null) {
                    FirebaseUserMetadata metadata = mAuth.getCurrentUser().getMetadata();
                    if (metadata.getCreationTimestamp() == metadata.getLastSignInTimestamp()) {
                        // The user is new, show them a fancy intro screen!
                        startActivity(new Intent(MainActivity.this, NewUserActivity.class));

                    } else {

                        if (prefManager.isFirstTimeLaunch()) {
                            // This is an existing user, show them a welcome back screen.
                            startActivity(new Intent(MainActivity.this, NewUserActivity.class));
                        }
                        else{
                            startActivity(new Intent(MainActivity.this, UserProfile.class));
                        }
                    }

                }

            }
        };

А в NewUserActivity:

btnEnterDungeons.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(!TextUtils.isEmpty(editUsername.getText().toString().trim())) {
                    uploadUserData();
                    Intent intent = new Intent();
                    intent.setClass(NewUserActivity.this, GameChooseActivity.class);
                    prefManager.setFirstTimeLaunch(false);
                    finishAffinity();
                    startActivity(intent);
                }

Таким образом, если пользователь уничтожит NewUserActivity без нажатия btnEnterDungeons, prefManager останется. Но когда цикл начинается снова, поскольку использование уже зарегистрировано через Google+ или Facebook... переходит к NewUserActivity и выдает исключение для UserProfile.

Конец ошибка происходит в строке 164 в UserProfile. Это означает, что он показывает NewUserActivity, но также загружает UserProfile.

//Method to get data from Firebase user and show them in profile
    private void getData() {
        final Context mContext = UserProfile.this;
        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        String userid = user.getUid();
        final long joinedDate = user.getMetadata().getCreationTimestamp();
        final SimpleDateFormat sdf = new SimpleDateFormat("MMM dd,yyyy HH:mm");
        final Date resultdate = new Date(joinedDate);
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");
        reference.child(userid).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                User user = dataSnapshot.getValue(User.class);
                userName.setText(user.getUserName());
                userClass.setText(user.getUser_class());
                imageURL = user.getAvatar();
                Picasso.with(mContext).load(imageURL).into(userAvatar);
                dateofJoin.setText((sdf.format(resultdate)));
                PvPWins.setText(String.valueOf(user.getPvP_Wins()));
                PvPScore.setText(String.valueOf(user.getPvP_scores()));
                userScore.setText(String.valueOf(totalScore));
                userGender.setText(user.getUser_gender());


            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
        });

1 ответ

Решение

Вы можете использовать Shared Preferences проверить, выполнил ли пользователь задачу "Регистрация" или нет.

Поэтому обычно процесс будет выглядеть следующим образом:

  1. В вашем действии Launcher, может быть ваш "SplashScreen" или "Login", вы проверяете Shared Preferences и посмотреть, если значение processCompleted true, по умолчанию значение false
  2. Если значение равно true, это означает, что пользователь уже завершил процесс, поэтому вы можете запустить намерение "Домой" напрямую
  3. Если значение равно false, это означает, что пользователь не завершил процесс, поэтому вы показываете намерение "Войти"
  4. Когда пользователь нажимает "GO", это означает, что он завершил процесс, поэтому вы обновляете значение processCompleted в Shared Preference с правдой.
  5. В следующий раз, когда пользователь откроет приложение, processCompleted будет правдой, и вы будете уверены, что он действительно дал всю необходимую вам информацию.

Надеюсь, поможет.

Другие вопросы по тегам