diff --git a/api/current.txt b/api/current.txt index d80b3b86e4631..27fd66964c5a1 100644 --- a/api/current.txt +++ b/api/current.txt @@ -4737,6 +4737,7 @@ package android.app { method public abstract android.app.Fragment getPrimaryNavigationFragment(); method public void invalidateOptionsMenu(); method public abstract boolean isDestroyed(); + method public abstract boolean isStateSaved(); method public abstract void popBackStack(); method public abstract void popBackStack(java.lang.String, int); method public abstract void popBackStack(int, int); diff --git a/api/system-current.txt b/api/system-current.txt index 4b887a7d800d5..a06c91395290a 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4898,6 +4898,7 @@ package android.app { method public abstract android.app.Fragment getPrimaryNavigationFragment(); method public void invalidateOptionsMenu(); method public abstract boolean isDestroyed(); + method public abstract boolean isStateSaved(); method public abstract void popBackStack(); method public abstract void popBackStack(java.lang.String, int); method public abstract void popBackStack(int, int); diff --git a/api/test-current.txt b/api/test-current.txt index 19530b5ff6246..a590e45cf903a 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -4747,6 +4747,7 @@ package android.app { method public abstract android.app.Fragment getPrimaryNavigationFragment(); method public void invalidateOptionsMenu(); method public abstract boolean isDestroyed(); + method public abstract boolean isStateSaved(); method public abstract void popBackStack(); method public abstract void popBackStack(java.lang.String, int); method public abstract void popBackStack(int, int); diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index a820da43a6ba1..0193c5f060c8e 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -2822,7 +2822,9 @@ public class Activity extends ContextThemeWrapper return; } - if (!mFragments.getFragmentManager().popBackStackImmediate()) { + FragmentManager fragmentManager = mFragments.getFragmentManager(); + + if (fragmentManager.isStateSaved() || !fragmentManager.popBackStackImmediate()) { finishAfterTransition(); } } diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index 8ad7810a13e84..977931a66e1e0 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -396,6 +396,19 @@ public abstract class FragmentManager { */ public void invalidateOptionsMenu() { } + /** + * Returns {@code true} if the FragmentManager's state has already been saved + * by its host. Any operations that would change saved state should not be performed + * if this method returns true. For example, any popBackStack() method, such as + * {@link #popBackStackImmediate()} or any FragmentTransaction using + * {@link FragmentTransaction#commit()} instead of + * {@link FragmentTransaction#commitAllowingStateLoss()} will change + * the state and will result in an error. + * + * @return true if this FragmentManager's state has already been saved by its host + */ + public abstract boolean isStateSaved(); + /** * Callback interface for listening to fragment state changes that happen * within a given FragmentManager. @@ -1787,6 +1800,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate } } + @Override public boolean isStateSaved() { return mStateSaved; }