为什么 DialogFragment 没有被销毁而 Dialog 被销毁?

Why DialogFragment is not being destroyed while Dialog is?

正如标题所说,为什么当 configChange 发生时 Android 保持 DialogFragment 打开,而任何类型的 Dialog 一旦出现就会被销毁一个 configChange?是因为 Android 不想保留对传递给 DialogContext 的引用吗?如果是这样,那么在 configChange 发生时,他们实际上是如何在 DialogFragment 中幸存下来的?

编辑:我知道 dialogFragment 正在重新创建,为什么他们不对 Dialogs 也做同样的事情?

DialogFragment 也被销毁,但随后重新创建。 setArguments(Bundle) 提供的数据被保留,可用于恢复片段的初始状态。

好吧,在我深入研究 DialogFragment 的源代码后,我发现它只是一个 Fragment 来处理 configChangessavingInstance当前 Fragment 并在 Orientation 更改后重新创建它。
当我们实际调用 dialogFragment.show(getSupportFragmentManager(),TAG) 时,框架会创建一个 Fragment 来处理 Dialog lifeCycle 例如

@Override public void onCreate(Bundle savedInstanceState) {
    if (savedInstanceState != null) {
        mStyle = savedInstanceState.getInt(SAVED_STYLE, STYLE_NORMAL);
        mTheme = savedInstanceState.getInt(SAVED_THEME, 0);
        mCancelable = savedInstanceState.getBoolean(SAVED_CANCELABLE, true);
        mShowsDialog = savedInstanceState.getBoolean(SAVED_SHOWS_DIALOG, mShowsDialog);
        mBackStackId = savedInstanceState.getInt(SAVED_BACK_STACK_ID, -1);
    }
}

onCreate 方法中恢复保存在

中的 Dialog 参数
onSaveInstanceState(Bundle outState)

并恢复
中的 dialog 实例 @Override public void onActivityCreated(Bundle savedInstanceState) {}
通过调用 mDialog.onRestoreInstanceState(dialogState);

所以当我们实际使用 DialogFragment 时,Framework 通过处理 Dialogs 显示时可能发生的 configChanges 来节省我们的时间。