如何在重新启动活动时保留intent对象的值?

时间:2017-12-27 12:53:33

标签: 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;}

    //setters and getters
}

在我的第一个活动中,我登录了Firebase,我从FirebaseUser对象获取数据,然后我创建了{{1}的对象} class并将其传递给这样的意图:

UserModel

在第二个活动中,每次启动时,我都会检查用户是否已登录。如果是,它会留在这里,如果不是,我会重定向到第一个活动。在这里,我使用以下代码行获取对象:

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("userModel", userModel);
startActivity(intent);

第一次活动开始时,一切正常,但当我重新开始活动时,我得到一个UserModel userModel = (UserModel) getIntent().getSerializableExtra("userModel"); 。如何通过任何活动重新启动来保留我从意图中获得的NullPointerException对象?

提前致谢!

2 个答案:

答案 0 :(得分:1)

你应该看一下Activity Lifecycle。你会找到一个名为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);
}

答案 1 :(得分:1)

您必须将模型保留到外部存储。一些可行的选择是:

  • SharedPreferences:保存在onPause(),在onResume()onCreate()中恢复;这是一个快速example
  • 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");
}

首先对意图进行空值检查,可以节省一些处理时间,同时不进行任何冗余操作。