一个应用程序有两个活动,A和B.
A具有保存的实例数据
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("foo", 0);
}
和A有
int bar;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ...
if (savedInstanceState != null) {
bar = savedInstanceState.getInt("foo");
} else {
bar = -1;
}
}
恢复数据。
活动B启用了操作栏并
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActionBar().setDisplayHomeAsUpEnabled(true);
// ...
}
启用导航功能。此外,A在AndroidManifest.xml
中列为B的父活动。
当用户从A导航到B onSaveInstanceState
时,如果他们使用后退按钮导航回A
,则A会正确恢复其保存的信息。
但是,当用户从A导航到B onSaveInstanceState
时,会使用向上导航返回A,即使已保存信息,onCreate(Bundle savedInstanceState)
也会传递null
。
如何启动导航以传递在onSaveInstanceState
中创建的Bundle?
答案 0 :(得分:3)
我遇到了同样的问题 - 我只想要有两个活动A和B,其中A是B的父级。当你在B中并单击向上按钮时,返回A并在onCreate()
中您从Bundle恢复数据。但是,捆绑包始终为null
。
在大多数情况下,人们建议为清单中的活动设置android:launchMode="singleTop"
。实际上,这不一定是所需的行为,因为它只是意味着当您单击“向上”按钮时,将不会重新创建父项。您可能会发现这很好,但在我的情况下,我肯定希望重新创建父级来镜像数据库中的某些更改。
其他解决方案是将侦听器附加到“向上”按钮并添加以下代码:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent intent = NavUtils.getParentActivityIntent(this);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
NavUtils.navigateUpFromSameTask(this);
break;
}
return super.onOptionsItemSelected(item);
}
这对我没有任何影响。我实际上并不明白这段代码应该做什么。
不过,我想我在另一篇文章中找到了问题的答案。检查here。
据说:
当您按下时,活动将被销毁,其中的数据将丢失。在此之后,当您重新打开应用程序时,正在创建新的新实例时,您将始终在包中获得null。
Bundle savedInstanceState用于在由于某些更改(如旋转)重新创建活动时使用,或者因为它在后台暂停了很长时间。
如果你想保留一些数据,可以考虑使用SharedPreferences来处理小东西,或者考虑数据库(SQLite,Realm)或大文件的文件。
我想使用捆绑包的方法根本不是Android希望我们这样做的方式。您应该使用SharedPreferences
对象并将foo
变量保存在其中。
答案 1 :(得分:0)
正如@castafiore 所说,这取决于您的应用程序想要什么行为。就我而言,我通过在 android:launchMode="singleInstance"
中添加 AndroidManifest.xml
解决了这个问题。