Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在活动重新启动时保留意图对象的值?_Java_Android_Firebase_Android Intent_Persistence - Fatal编程技术网

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
    onPause()
    ,restore in
    onResume()
    onCreate()
    ;这里有一个快速的例子
  • SaveInstanceState
例如,通过覆盖以下回调来执行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
    onPause()
    ,restore in
    onResume()
    onCreate()
    ;这里有一个快速的例子
  • SaveInstanceState
例如,通过覆盖以下回调来执行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.use
LiveData
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
。为什么会这样?