Android обрабатывает поведение пользователей onStop и onDestroy - PullRequest
0 голосов
/ 29 января 2019

У меня есть логин пользователя, логин с 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 Ответ

0 голосов
/ 29 января 2019

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...