向上导航和保存的实例数据

时间:2014-01-11 01:52:58

标签: android android-activity android-actionbar

一个应用程序有两个活动,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?

2 个答案:

答案 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 解决了这个问题。