FragmentActivity onSaveInstanceState没有被调用

我已经看到了一些关于onSaveInstanceState没有被调用的Fragment的类似问题,但在我的情况下, Fragment的工作正常,这是主要的FragmentActivity有麻烦。

相关的代码看起来相当简单:

 public class MyFActivity extends FragmentActivity implements ActionBar.TabListener { String[] allValues; // data to save @Override protected void onSaveInstanceState (Bundle outState) { Log.d("putting it!", allValues.toString()); outState.putStringArray("allValues", allValues); super.onSaveInstanceState(outState); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { allValues = savedInstanceState.getStringArray("allValues"); Log.d("getting it!", allValues.toString()); } } } 

当暂停活动(使用后退button)时, onSaveInstanceState永远不会被调用,因此,在恢复应用程序时, savedInstanceStateonCreate方法中始终为null 。 我试图添加一个像这样的块:

 @Override public void onPause() { super.onPause(); onSaveInstanceState(new Bundle()); } 

这是在https://stackoverflow.com/a/14195202/362657build议,但onSaveInstanceState然后被调用, savedInstanceStateonCreate方法内保持为null 。 我错过了什么?

Solutions Collecting From Web of "FragmentActivity onSaveInstanceState没有被调用"

这里的问题是你误解了onSaveInstanceState是如何工作的。 它旨在保存Activity / Fragment的状态,以防OS出于内存原因或configuration更改而需要销毁。 当Activity / Fragment返回/重新启动时,这个状态会在onCreate传回。

在一个Fragment ,所有的生命周期callback都直接绑定到他们的父Activity 。 因此onSaveInstanceState在其父ActivityonSaveInstanceState调用时在Fragment被调用。

当暂停活动(使用后退button)时,onSaveInstanceState永远不会被调用,因此,在恢复应用程序时,savedInstanceState在onCreate方法中始终为null。

当按下时,用户正在销毁Activity ,因此它的子Fragment ,所以没有理由调用onSaveInstanceState ,因为这个实例正在被销毁。 当你重新打开Activity ,这是一个全新的实例,没有保存状态,所以传入onCreateBundlenull 。 这是完全按照devise行事。 但是,尝试旋转设备或按主页button,然后你会看到Activity和其子FragmentonSaveInstanceState调用,并返回时返回onCreate返回。

你添加的hack ,直接调用onSaveInstanceState(new Bundle());onPause里面,是一个非常糟糕的做法,因为你不应该直接调用生命周期callback。 这样做可能会将您的应用程序置于非法状态。

如果你真正想要的是让你的数据超越你的应用程序的实例,我build议你考虑使用SharedPreferences或数据库来获得更高级的数据。 然后,您可以将持久性数据保存在onPause()或每当它发生更改时。

希望这可以帮助。

在接受答案的更新中:

如果您将ViewPagerFragmentStatePagerAdapter (而不是FragmentPagerAdapter )一起使用,则可以调用片段的onSaveInstanceState

FragmentStatePagerAdapter

当有大量的页面时,这个版本的寻呼机更加有用,更像是一个列表视图。 当页面对用户不可见时,它们的整个片段可能被破坏,只保留该片段的保存状态。 与FragmentPagerAdapter相比,这允许寻呼机保持与每个被访问页面相关的更less的存储器,代价是在页面之间切换时可能会有更多的开销。

别忘了:

当使用FragmentPagerAdapter时,主机ViewPager必须有一个有效的ID集。