为什么在添加片段时检查savedInstanceState == null?

在片段doc中 ,在其中一个示例中,他们在添加片段时检查savedInstanceState == null

 public static class DetailsActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { // If the screen is now in landscape mode, we can show the // dialog in-line with the list so we don't need this activity. finish(); return; } if (savedInstanceState == null) { // During initial setup, plug in the details fragment. DetailsFragment details = new DetailsFragment(); details.setArguments(getIntent().getExtras()); getFragmentManager().beginTransaction().add(android.R.id.content, details).commit(); } } } 

这个检查的目的是什么? 如果不在那里会发生什么?

Solutions Collecting From Web of "为什么在添加片段时检查savedInstanceState == null?"

这个检查的目的是什么?

为了不添加片段两次,尽pipe我更喜欢检查片段是否存在,而不是依赖于该Bundlenull

如果不在那里会发生什么?

最初什么也没有,因为在第一次创build活动时Bundle将是null的。

然而,然后,用户将设备的屏幕从纵向旋转到横向。 或者,用户改变语言。 或者,用户将设备放入制造商提供的汽车底座中。 或者,用户进行其他configuration更改。

您的活动将被销毁并在默认情况下重新创build。 您的碎片也将被销毁并在默认情况下重新创build(例外:调用了setRetainInstance(true) ,这些setRetainInstance(true)从旧的活动中分离出来并附加到新的碎片上)。

所以, 第二次创build活动 – 由于configuration更改而创build的实例 – 您的分段已经存在 ,因为它被重新创build或保留。 您不需要该片段的第二个实例(通常),因此您可以采取措施检测是否发生了这种情况,而不是运行新的FragmentTransaction