diff options
| -rw-r--r-- | core/java/android/app/Activity.java | 13 | ||||
| -rw-r--r-- | core/java/android/app/ActivityThread.java | 23 | 
2 files changed, 27 insertions, 9 deletions
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index cd029c06b91d..6a9d8f77f4ff 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -424,6 +424,12 @@ import java.util.List;   * safely called after {@link #onPause()} and allows and application to safely   * wait until {@link #onStop()} to save persistent state.</p>   * + * <p class="note">For applications targeting platforms starting with + * {@link android.os.Build.VERSION_CODES#P} {@link #onSaveInstanceState(Bundle)} + * will always be called after {@link #onStop}, so an application may safely + * perform fragment transactions in {@link #onStop} and will be able to save + * persistent state later.</p> + *   * <p>For those methods that are not marked as being killable, the activity's   * process will not be killed by the system starting from the time the method   * is called and continuing after it returns.  Thus an activity is in the killable @@ -1576,8 +1582,11 @@ public class Activity extends ContextThemeWrapper       * call through to the default implementation, otherwise be prepared to save       * all of the state of each view yourself.       * -     * <p>If called, this method will occur before {@link #onStop}.  There are -     * no guarantees about whether it will occur before or after {@link #onPause}. +     * <p>If called, this method will occur after {@link #onStop} for applications +     * targeting platforms starting with {@link android.os.Build.VERSION_CODES#P}. +     * For applications targeting earlier platform versions this method will occur +     * before {@link #onStop} and there are no guarantees about whether it will +     * occur before or after {@link #onPause}.       *       * @param outState Bundle in which to place your saved state.       * diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 2b548b1fd14b..095404644436 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -487,12 +487,14 @@ public final class ActivityThread extends ClientTransactionHandler {              }          } -        public boolean isPreHoneycomb() { -            if (activity != null) { -                return activity.getApplicationInfo().targetSdkVersion -                        < android.os.Build.VERSION_CODES.HONEYCOMB; -            } -            return false; +        private boolean isPreHoneycomb() { +            return activity != null && activity.getApplicationInfo().targetSdkVersion +                    < android.os.Build.VERSION_CODES.HONEYCOMB; +        } + +        private boolean isPreP() { +            return activity != null && activity.getApplicationInfo().targetSdkVersion +                    < android.os.Build.VERSION_CODES.P;          }          public boolean isPersistable() { @@ -4164,9 +4166,12 @@ public final class ActivityThread extends ClientTransactionHandler {       * {@link Activity#onSaveInstanceState(Bundle)} is also executed in the same call.       */      private void callActivityOnStop(ActivityClientRecord r, boolean saveState, String reason) { +        // Before P onSaveInstanceState was called before onStop, starting with P it's +        // called after. Before Honeycomb state was always saved before onPause.          final boolean shouldSaveState = saveState && !r.activity.mFinished && r.state == null                  && !r.isPreHoneycomb(); -        if (shouldSaveState) { +        final boolean isPreP = r.isPreP(); +        if (shouldSaveState && isPreP) {              callActivityOnSaveInstanceState(r);          } @@ -4185,6 +4190,10 @@ public final class ActivityThread extends ClientTransactionHandler {          r.setState(ON_STOP);          EventLog.writeEvent(LOG_AM_ON_STOP_CALLED, UserHandle.myUserId(),                  r.activity.getComponentName().getClassName(), reason); + +        if (shouldSaveState && !isPreP) { +            callActivityOnSaveInstanceState(r); +        }      }      private void updateVisibility(ActivityClientRecord r, boolean show) {  |