在后退按钮后再次创建 Activity 时,Parcelable 数据不可用

Parcelable data unavailable when an Activity is created again after back button

我有一个清单Activity。它接收一个可打包的对象并将其保存为 属性。

问题是,当您按下一个 ListView 项目时,另一个 Activity 出现:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_main);
    setHjClient((Client) getIntent().getParcelableExtra("hjClient"));
    setListAdapter(new ComplejoListAdapter(this, getHjClient().getComplejos()));
}

@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    //super.onListItemClick(l, v, position, id);
    Complejo c = ((Complejo) l.getAdapter().getItem(position));
    Intent i = new Intent(this, ComplejoActivity.class);
    i.putExtra("session", getHjClient().getSession());
    i.putExtra("complejo", c);
    startActivity(i);
}

直到这里一切都按预期工作,但是当我按下后退按钮时,再次调用 OnCreate 方法但现在 getIntent() 为 null 所以我没有我需要填充我的 ListView 的可打包数据所以我收到 NullPointerException 错误。

当我按下后退按钮后 Activity 出现时,我如何访问该可打包数据?

编辑了我的 onCreate 方法:

Client hjClient;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //setContentView(R.layout.activity_main);
    if (getIntent().getExtras() != null) {
        setHjClient((Client) getIntent().getParcelableExtra("hjClient"));
        setListAdapter(new ComplejoListAdapter(this, getHjClient().getComplejos()));
    } else if (savedInstanceState != null) {
        setHjClient((Client) savedInstanceState.getParcelable("hjClient"));
        setListAdapter(new ComplejoListAdapter(this, getHjClient().getComplejos()));
    }
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putParcelable("hjClient", getHjClient());
    super.onSaveInstanceState(outState);
}

你可以用startActivityForResult代替startActivity,等另一个activity完成后再把Intent发回来。

您可以尝试使用 onSaveInstanceState() 在 activity 消失之前保存您的数据。

你的 'Activity' 听起来像是被破坏了(可能是因为内存限制)。

这是一个 "classic" 案例,当 Android 说您需要保留数据以防发生您无法控制的事件。最好的例子是当用户在您的应用程序中并且 phone 响铃时。他们离开您的应用程序,当他们 return 时,您不应该期望 "state" 被保存。

您需要找到一种方法来保存从以下位置获得的可打包数据:

getIntent().getParcelableExtra("hjClient"))

该调用应针对 "SharedPreferences" 或其他持久性数据存储。

这不容易实现,因为如果您有其他方式让用户可以访问此 Activity,那么您需要考虑到这一点。

另一种方法(在另一个答案中提到但没有得到很好的解释)是将您的数据捆绑在一起以开始下一个 Activity,然后当 Activity 完成时,将其传回'onActivityForResult' 中的数据,使用 'setResult',如下所述:

Get result from an activity after finish(); in an Android unit test

然后检查您的数据结果并重新填充您的客户端对象。

底线:不要指望用户能够 return 到任何 activity 他们上次看到的状态,而无需保留数据以重新创建该状态。