savedInstanceState始终为null

med*_*med 68 android

这是我的savedInstaceState代码:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) 
{
    savedInstanceState.putStringArrayList("todo_arraylist", Altodo);
    Log.v("bundle", "Saved");
    super.onSaveInstanceState(savedInstanceState);
}


public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) 
    {
        Altodo = savedInstanceState.getStringArrayList("todo_arraylist");
        Log.v("bundle", "Restored");
    }
    else
    {
        Log.v("bundle", "null");
    }

    setContentView(R.layout.main);
}
Run Code Online (Sandbox Code Playgroud)

日志始终显示"捆绑保存"标记.

但在onCreate方法中,SavedInstanceState始终为null.

s.b*_*ara 50

我在一个项目中观察到完全相同的症状(报告为问题133394),其中有两个活动AB延伸ActionBarActivity.活性是主要的活性,我总是接收null用于savedInstanceStateonCreate其列表片段从一个详细视图活动返回时.经过几个小时,这个问题暴露给我作为伪装的导航问题.

以下内容可能与我的设置有关,并且来自此页面上的其他答案:

  • 鉴于这个答案,我确保片段和活动都设置了唯一的ID.
  • onSaveInstanceState没有super电话就没有覆盖.
  • 活动A被指定为acitivy B的父级AndroidManifest.xml,使用Android的早期版本的android:parentActivityName属性和相应meta-data标签(请参阅" 提供导航 ").

已经没有任何相应的创建代码,例如getActionBar() .setHomeButtonEnabled(true),活动B在其操作栏中有一个功能后退按钮(<).当点击此按钮时,活动A重新出现,但(a)所有先前的实例状态丢失,(b) onCreate始终被调用,(c) savedInstanceState始终null.

有趣的是,当我点击模拟器显示器底部边缘提供的后退按钮(一个指向左侧的空心三角形)时,活动A会在不调用的情况下重新出现(即实例状态完全保留)onCreate.那么导航可能有问题吗?

经过更多阅读后,我实施了自己的导航说明,以响应活动B中后退按钮的点击:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home)
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}
Run Code Online (Sandbox Code Playgroud)

与恢复实例活动状态A无关的任何内容都已更改.NavUtils还提供了一个方法getParentActivityIntent(Activity),并navigateUpTo(Activity, Intent)允许我们修改导航意图明确指示该活动的一个通过设置(不提供保存实例状态,因而)不启动新的FLAG_ACTIVITY_CLEAR_TOP标志:

如果已设置,并且正在启动的活动已在当前任务中运行,则不会启动该活动的新实例,而是将关闭其上的所有其他活动,并将此Intent传递给(现在开启) top)旧活动作为新的意图.

在我手中,这解决了丢失实例状态的问题,可能看起来像:

public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId()== android.R.id.home) {
        Intent intent = NavUtils.getParentActivityIntent(this);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        NavUtils.navigateUpTo(this, intent);
        return true;
    }
    return super.onOptionsItemSelected(item);
}
Run Code Online (Sandbox Code Playgroud)

请注意,在用户可以从不同任务中直接切换到活动B的其他情况下,这可能不是完整的解决方案(请参阅此处).此外,一个可能不相同的行为解决方案NavUtils是简单地调用finish():

public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId()== android.R.id.home) {
        finish();
        return true;
    }
    return super.onOptionsItemSelected(item);
}
Run Code Online (Sandbox Code Playgroud)

这两种解决方案都在我手中.我只是推测原始问题是一个稍微不正确的后退按钮的默认实现,它可能与调用某种navigateUp错过的实现有关FLAG_ACTIVITY_CLEAR_TOP.

  • 谢谢,这个解决方案是唯一有效的解决方案 (2认同)
  • 惊人的。我使用您提供的最后一个解决方案将其实现到我的基本活动中,但是我用“onBackPressed();”替换了“finish();”。 (2认同)
  • 这个答案对我帮助很大!我仍然不确定为什么操作栏后退按钮的行为与设备后退按钮的行为不同,但是一旦我在 AndroidManifest.xml 中将 `android:launchMode="singleTop"` 添加到我的活动的 XML 定义中,它就开始一致地工作。根据文档,这与您所做的添加“FLAG_ACTIVITY_CLEAR_TOP”基本相同。 (2认同)
  • 2020 年了,我仍然遇到这个错误。荒谬的。Google 忽略了这个问题 133394 5 年,直到 2020 年 4 月,然后关闭它“因为不会修复过时的问题”。感谢您的全面回答;最后一个 onOptions...finish() 斑点为我修复了它。看来你的将是相当长一段时间内唯一的解决办法。再次感谢,在我拔掉头发几天后,你救了我。 (2认同)

PHF*_*PHF 14

您是否检查过是否为该视图设置了Id(如果视图是/有......).否则不会调用onSaveInstanceState().

检查此链接.

  • 这个答案似乎与提出的问题无关.Med声明onSaveInstanceState()总是被调用,所以问题不在于onSaveInstanceState()没有被调用 (2认同)

mxc*_*xcl 13

以这种方式保存的国家不会持久存在.如果在调试期间整个应用程序被杀死,则bundle将始终为null onCreate.

这个IMO是糟糕的Android文档的另一个例子.这也是为什么市场上的大多数应用程序都没有正确实现保存状态(根本).

  • 我全心全意地同意"糟糕的文件"顺便说一下. (7认同)
  • 它看起来像一个错误,因为文档明确表示即使在销毁活动时也会保存状态http://developer.android.com/guide/components/activities.html#SavingActivityState我创建了问题https://code.google .COM/p /安卓/问题/细节?ID = 133394 (3认同)
  • 所以这只是为了屏幕方向的变化等? (2认同)

小智 7

在Manifest中为活动添加此行

android:launchMode="singleTop"
Run Code Online (Sandbox Code Playgroud)

例如:

<activity
        android:name=".ActivityUniversity"
        android:label="@string/university"
        android:launchMode="singleTop"
        android:parentActivityName="com.alkhorazmiy.dtm.ActivityChart">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.alkhorazmiy.dtm.ActivityChart" />
    </activity>
Run Code Online (Sandbox Code Playgroud)