来自 Fragment 的 onBackPressed 显示 Activity 两次

onBackPressed from Fragment Displays Activity Twice

我有一个最小 SDK 21、目标 25 的应用程序。使用:android.app.DialogFragmentandroid.support.v7.app.AppCompatActivity.

最初的 Activity 是一个启动器,它可以启动 3 个活动中的 1 个和 1 个 DialogFragmentDialogFragment 可以依次启动 Activity(这是 3 个活动之一)。我遇到的问题仅与正在加载的 DialogFragment 和该片段然后加载应用程序然后 returning 到启动器有关。

Fragment return 立即进入 Launcher(无需加载 Activity)时,此操作正常。我可以检测到 Fragment 是通过启动器加载的,并且 onBackPress() 可以正常处理它。

但是,当Fragment加载另一个Activity然后onBackPress()用于return到Fragment然后onBackPress()习惯return到启动器,我有问题。目前处理这种情况的方式是 Fragment 使用标志 FLAG_ACTIVITY_CLEAR_TASKFLAG_ACTIVITY_NEW_TASK 以及 FLAG_ACTIVITY_CLEAR_TOP 通过 Intent 加载启动器(这似乎是解决某人类似问题的方法)。我已经尝试了这些标志的其他变体,也没有使用这些标志。我还尝试在 DialogFragment 中使用 onBackPress() 而不使用 Intent 加载 Activity,应用程序终止,我需要它 return启动器。

在这种情况下,使用这些标志,当我 return 到启动器时,启动器显示然后清除然后重新显示(在另一个 onBackPress() 上,应用程序然后正确终止)。问题是启动器显示两次。我假设首先显示的 Launcher 是加载的原始副本,然后被新副本替换。我还没有找到一种方法(在这种情况下)加载启动器的原始副本(如果这实际上是正在发生的事情)。如前所述,这是 DialogFragment.

如何解决这个问题,使 Launcher Activity 在这种情况下不显示两次?

为什么不直接将 return 片段中的 activity 完成到启动器 activity?

如果你真的必须使用一个意图,试试Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

尝试重写 onBackPressed() 方法,如下所示:

@Override
public void onBackPressed() {
    int count = fragmentManager.getBackStackEntryCount();

    if (count == 1) {
        finish();
    } else {
        fragmentManager.popBackStack();
    }
}
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
   getSupportFragmentManager().popBackStackImmediate();
} 
else {
  super.onBackPressed();
}

onBackPressed() 方法中使用它。