Java 如何在活动重新启动时保留意图对象的值?
我有以下场景:我有一个模型类,如下所示:Java 如何在活动重新启动时保留意图对象的值?,java,android,firebase,android-intent,persistence,Java,Android,Firebase,Android Intent,Persistence,我有以下场景:我有一个模型类,如下所示: public class UserModel implements Serializable { private String userEmail, userName; public UserModel() {} public UserModel(String userEmail, String userName) { this.userEmail = userEmail; this.userName = userName;}
public class UserModel implements Serializable {
private String userEmail, userName;
public UserModel() {}
public UserModel(String userEmail, String userName) { this.userEmail = userEmail; this.userName = userName;}
//setters and getters
}
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("userModel", userModel);
startActivity(intent);
在我的第一个活动中,我登录Firebase,从FirebaseUser
对象获取数据,然后创建UserModel
类的对象,并将其传递给intent,如下所示:
public class UserModel implements Serializable {
private String userEmail, userName;
public UserModel() {}
public UserModel(String userEmail, String userName) { this.userEmail = userEmail; this.userName = userName;}
//setters and getters
}
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("userModel", userModel);
startActivity(intent);
在第二个活动中,每次启动时,我都会检查用户是否登录。如果是,它将留在这里,如果不是,我将重定向到第一个活动。在这里,我使用以下代码行获取对象:
UserModel userModel = (UserModel) getIntent().getSerializableExtra("userModel");
第一次启动活动时,一切正常,但当我重新启动活动时,我得到一个NullPointerException
。如何保留通过任何活动重新启动从intent获得的userModel
对象
提前谢谢 你应该看一看。您将发现一个名为
的方法onSavedInstanceState()
。现在,您要做的是使用该方法将类的对象存储在bundle中,并将其返回到onCreate()
,如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
UserModel userModel = (UserModel) savedInstanceState.getSerializable("userModel");
} else if (getIntent() != null) {
UserModel userModel = (UserModel) getIntent().getSerializableExtra("userModel");
} else {
// These is no data
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("userModel", userModel);
}
你应该看一看这本书。您将发现一个名为
的方法onSavedInstanceState()
。现在,您要做的是使用该方法将类的对象存储在bundle中,并将其返回到onCreate()
,如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
UserModel userModel = (UserModel) savedInstanceState.getSerializable("userModel");
} else if (getIntent() != null) {
UserModel userModel = (UserModel) getIntent().getSerializableExtra("userModel");
} else {
// These is no data
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("userModel", userModel);
}
您必须将模型持久化到外部存储。一些可行的选择是:
- SharedReferences:save in
,restore inonPause()
或onResume()
;这里有一个快速的例子onCreate()
- SaveInstanceState
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
/* savedInstanceState Bundle will be passed onto onCreate() when activity
* gets killed and restarted. */
savedInstanceState.putSerializable("userModel", userModel);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
/* Also being passed onto onCreate(). */
UserModel mUserModel = (UserModel) savedInstanceState.getSerializable("userModel");
}
通过首先对意图执行空检查,您可以节省一些处理时间,同时不执行任何冗余操作。您必须将模型持久化到外部存储。一些可行的选择是:
- SharedReferences:save in
,restore inonPause()
或onResume()
;这里有一个快速的例子onCreate()
- SaveInstanceState
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
/* savedInstanceState Bundle will be passed onto onCreate() when activity
* gets killed and restarted. */
savedInstanceState.putSerializable("userModel", userModel);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
/* Also being passed onto onCreate(). */
UserModel mUserModel = (UserModel) savedInstanceState.getSerializable("userModel");
}
通过先对意图进行空检查,您可以节省一些处理时间,同时不做任何冗余操作。使用
LiveData
和ViewModel
类。我找到的最佳解决方案@SripadRaj为什么要使用SharedReferences
而不是意图?这有什么不对?@kuldippetel通过LiveData和ViewModel
你是什么意思?@IoanaP。对不起,我想我误解了你的问题。但是为了回答您的问题,Sharedprefs数据可以随时访问,但是在意图中,如果您不传递意图,您将无法获得数据。当活动重新启动时,您可能无法通过intent获取数据。所以它抛出了NPE.useLiveData
和ViewModel
类@SripadRaj为什么要使用SharedReferences
而不是意图?这有什么不对?@kuldippetel通过LiveData和ViewModel
你是什么意思?@IoanaP。对不起,我想我误解了你的问题。但是为了回答您的问题,Sharedprefs数据可以随时访问,但是在意图中,如果您不传递意图,您将无法获得数据。当活动重新启动时,您可能无法通过intent获取数据。因此它抛出了NPE。Bundle对象没有getSerializableExtra()
。我在匆忙中错过了它,同时从问题中复制。我已经编辑过它。如果我将mUserModel
作为全局变量,当我试图通过我的活动使用mUserModel
对象时,我会得到NullPointerException
。是的,saveInstanceState
仅在Android调度程序抢占活动实例后,才会重新创建该活动实例。因此,要正确响应用户引发的上下文切换,您必须返回到SharedReferences
,并将状态保存在onPause()
。因此,在我的情况下,我只能使用SharedReferences
?捆绑对象没有getSerializableExtra()
。我匆忙错过了它,在抄袭问题时。我已经编辑过它。如果我将mUserModel
作为全局变量,当我试图通过我的活动使用mUserModel
对象时,我会得到NullPointerException
。是的,saveInstanceState
仅在Android调度程序抢占活动实例后,才会重新创建该活动实例。因此,为了正确响应用户引发的上下文切换,您必须返回到SharedReferences
,并将状态保存在onPause()
中。因此,在我的情况下,我只能使用SharedReferences
?在应用程序之间切换时,我得到一个NullPointerException
。似乎在调用onPause
时,我的对象也是null
。为什么会发生这种情况?当我在应用程序之间切换时,我得到了一个NullPointerException
。似乎在调用onPause
时,我的对象也是null
。为什么会这样?