为什么我的自定义对象不会被onSaveInstanceState和onRestoreInstanceState持久化

时间:2014-05-31 09:55:14

标签: android

第一次调用活动时,会在intent中调用额外的活动。收到额外信息并存储在数据成员中:

class EditBlindScheduleActivity extends Activity
{
  private BlindSchedule blindSchedule;

  protected void onCreate(Bundle savedInstanceState) 
  {
    ...

    if (savedInstanceState == null) {  // Not recreating, first load.
      blindSchedule = (BlindSchedule) getIntent().getSerializableExtra("blindSchedule");
    }

有一个简单的if / else来确定我们是否有blindSchedule对象。

if (blindSchedule == null) {
  setTitle("Create Blind Schedule");
} else {
  setTitle("Edit Blind Schedule");
}

当我第一次加载活动时,确实标题是"编辑盲计划",这意味着有一个blindSchedule对象。

不幸的是,当我旋转屏幕两次时,标题会显示" Create Blind Schedule",这意味着blindSchedule对象为空并且无法保留。

为什么我的blindSchedule对象没有被持久化,我该怎么办呢?

完整代码如下:

public class EditBlindScheduleActivity extends Activity {

  private BlindSchedule blindSchedule;

  Boolean creating;  // Creating or updating?

  @Override
  protected void onCreate(Bundle savedInstanceState) 
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_edit_blind_schedule);

    if (savedInstanceState == null) {  // Not recreating, first load.
      blindSchedule = (BlindSchedule) getIntent().getSerializableExtra("blindSchedule");
    }

    if (blindSchedule == null) {
      creating = true;
      setTitle("Create Blind Schedule");
    } else {
      creating = false;
      setTitle("Edit Blind Schedule");
    }
  }

  @Override
  protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    blindSchedule = (BlindSchedule) savedInstanceState.getSerializable("blindSchedule");
  }

  @Override
  protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putSerializable("blindSchedule", blindSchedule);
  }

1 个答案:

答案 0 :(得分:2)

您需要在onCreate中检索保存的自定义对象。

根据Official Documentation

onRestoreInstanceState之后调用{p> onStart,此时您的setTitle已被调用。

将其他部分添加到if (savedInstanceState == null),并以与blindSchedule

相同的方式检索getIntent
if (savedInstanceState == null) 
{  // Not recreating, first load.
  blindSchedule = (BlindSchedule) getIntent().getSerializableExtra("blindSchedule");
}
else
{
  blindSchedule = (BlindSchedule) savedInstanceState.getSerializableExtra("blindSchedule");
}