如何在 activity 重启后保留 intent 对象的值?

How to preserve the value of intent object upon activity restart?

我有以下情况:我有一个模型 class,它看起来像这样:

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
}

在我的第一个 activity 中,我登录到 Firebase,从 FirebaseUser 对象获取数据,然后创建 UserModel class 并将其传递给这样的意图:

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

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

UserModel userModel = (UserModel) getIntent().getSerializableExtra("userModel");

第一次 activity 启动时,一切正常,但是当我重新启动 activity 时,我得到 NullPointerException。如何保留通过任何 activity 重新启动从 Intent 获得的 userModel 对象?

提前致谢!

你应该看看Activity Lifecycle。您会发现一个名为 onSavedInstanceState() 的方法。现在您要做的是使用该方法将 class 的对象存储在包中,然后将其取回 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);
}

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

  • SharedPreferences:保存在onPause(),恢复在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");
}

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