在onSaveInstanceState()

时间:2016-05-05 21:19:15

标签: android android-fragments

我的活动在恢复时可能会显示DialogFragment。正如fragment transactions tutorial中所述,我在onResumeFragments()中这样做,以避免可怕的IllegalStateException: Can not perform this action after onSaveInstanceState。在大多数情况下,一切都很好。

但我的活动还有一个OnSharedPreferenceChangeListener,可以在更改某个偏好时重新启动活动。触发侦听器的首选项更改是由Spinner中的选择引起的。如果活动通过调用recreate()重新启动,则会获得IllegalStateException。但如果活动像这样重新启动,那就没问题了:

finish();
final Intent intent = new Intent(StartActivity.this, StartActivity.class);
startActivity(intent);

我更喜欢使用recreate(),因为我希望保存我的实例状态。为什么会导致在onResumeFragments()之后调用onSaveInstanceState()

1 个答案:

答案 0 :(得分:0)

嗯,我觉得有点愚蠢。我有一个名为setRetainInstance(true)的片段,但在onCreate(...)而不是onActivityCreated(...)中缓存了对其活动的引用。该片段试图使用旧活动显示对话框。 (更确切地说,活动是从onResumeFragments()间接调用片段上的方法。)相当混乱。我应该重新考虑片段和活动之间的整个关系。

编辑:我已经发现了另一种可能发生的方式,这不是我的错。如果锁定屏幕显示在正在运行的活动上,则会调用onSaveInstanceState()。但是当锁定屏幕被解除时,onRestoreInstanceState()onResume()onResumeFragments()之间 。这个bug至少有五年了。谢谢,谷歌。