在后退按钮后再次创建 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 他们上次看到的状态,而无需保留数据以重新创建该状态。
我有一个清单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 他们上次看到的状态,而无需保留数据以重新创建该状态。