android - Android 处理 onStop 和 onDestroy 用户行为
问题描述
我有一个登录用户流程,用户使用 Google+ 或 Facebook 登录。然后在下一个活动中,如果这是他第一次使用应用程序(共享首选项),他会选择性别和昵称。当用户按下“Go”按钮时,他会触发上传功能:
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);
}
因此,如果用户在不按 btnEnterDungeons 的情况下销毁 NewUserActivity,则 prefManager 仍然存在。但是,当循环再次开始时,因为用户已经使用 Google+ 或 Facebook 登录...转到 NewUserActivity 并为 UserProfile 抛出异常。
结束错误发生在 UserProfile 的第 164 行。这意味着它会显示 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) {
}
});
解决方案
您可以使用Shared Preferences
来检查用户是否已完成“注册”任务。
因此,通常该过程如下所示:
- 在您的 Launcher 活动中,可能是您的“SplashScreen”或“Login”活动,您检查
Shared Preferences
并查看 的值是否processCompleted
为 true,默认情况下为 false - 如果值为 true ,则表示用户已经完成该过程,因此您可以直接启动“主页”意图
- 如果该值为 false,则表示用户未完成该过程,因此您显示“登录”意图
- 当用户单击“开始”时,意味着他完成了该过程,因此您将
processCompleted
in的值更新为Shared Preference
true。 - 下次用户打开应用程序时,这
processCompleted
将是真实的,您将确定他确实提供了您需要的所有信息。
希望能帮助到你。
推荐阅读
- javascript - 将 addeventlistener 添加到节点列表
- django - 如何在 Django 模型中拥有喜欢/不喜欢的机制
- laravel - 发布并获取索引控制器 laravel
- visual-studio - 如何以编程方式检查 Visual Studio 扩展中的堆栈?
- azure - 当带有服务总线队列触发器的 Azure 函数被禁用并且消息被排队时会发生什么
- azure-devops - Azure DevOps:无法从环境变量中的变量组获取秘密值
- android - AccessibilityService 调度的手势在触摸屏幕的另一部分时停止
- html - 如何在视频上叠加部分图像?
- arrays - 如何在 Perl 中为数组指定步幅
- json - Jolt 变换 - 如何连接两个属性