代码之家  ›  专栏  ›  技术社区  ›  Always Learner

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

  •  0
  • Always Learner  · 技术社区  · 6 年前

    我有以下场景:我有一个模型类,如下所示:

    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 然后我创建一个 UserModel 类并将其传递给intent,如下所示:

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

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

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

    活动第一次启动时,一切正常,但当我重新启动活动时,我得到 NullPointerException . 如何保存 userModel 我通过任何活动重新启动从意图中获得的对象?

    提前感谢!

    2 回复  |  直到 6 年前
        1
  •  2
  •   Kartik Arora    6 年前

    你应该看看 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);
    }
    
        2
  •  1
  •   Dimitar    6 年前

    您必须将模型持久化到外部存储。一些可行的选择包括:

    • 共享引用:保存在 onPause() ,在中还原 onResume() onCreate() ; 这里有一个快速 example .
    • 保存实例状态

    例如,通过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");
    }
    

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