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
проверить, выполнил ли пользователь задачу "Регистрация" или нет.
Поэтому обычно процесс будет выглядеть следующим образом:
- В вашем действии Launcher, может быть ваш "SplashScreen" или "Login", вы проверяете
Shared Preferences
и посмотреть, если значениеprocessCompleted
true, по умолчанию значение false - Если значение равно true, это означает, что пользователь уже завершил процесс, поэтому вы можете запустить намерение "Домой" напрямую
- Если значение равно false, это означает, что пользователь не завершил процесс, поэтому вы показываете намерение "Войти"
- Когда пользователь нажимает "GO", это означает, что он завершил процесс, поэтому вы обновляете значение
processCompleted
вShared Preference
с правдой. - В следующий раз, когда пользователь откроет приложение,
processCompleted
будет правдой, и вы будете уверены, что он действительно дал всю необходимую вам информацию.
Надеюсь, поможет.