在后退按钮后再次创建活动时,可用的数据不可用

时间:2015-05-08 02:44:19

标签: java android android-activity parcelable oncreate

我有一个ListActivity。它接收一个可分配的对象并将其保存为属性。

问题是当你按下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显示时,如何访问该parcelable数据?

编辑我的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);
}

3 个答案:

答案 0 :(得分:1)

你的“活动”听起来像是被破坏了(可能是因为内存限制)。

这是一个“经典”案例,当Android表示您需要保留数据以防万一事件发生在您无法控制的情况下。最好的例子是当用户在您的应用程序中并且电话响铃时。他们离开你的应用程序,当他们返回时,你不应该期望保存“状态”。

您需要找到一种方法来保存您获得的可分割数据:

getIntent().getParcelableExtra("hjClient"))

该调用应该是“SharedPreferences”或其他持久性数据存储。

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

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

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

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

结论:不要指望用户能够在他们上次看到状态的情况下返回任何活动,而不会持续数据重新创建该状态。

答案 1 :(得分:0)

您可以使用startActivityForResult代替startActivity,然后在其他活动完成时发回Intent。

答案 2 :(得分:0)

您可以尝试使用if(peer_connection[signal.id]){ //do something... }else{ peer_connection[signal.id] = new PeerConnection(... } 在活动消失之前保存数据。