diff options
-rw-r--r-- | core/java/android/app/Activity.java | 30 | ||||
-rwxr-xr-x | services/core/java/com/android/server/am/ActivityStack.java | 10 |
2 files changed, 28 insertions, 12 deletions
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index 25c4897..9f683e3 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -5466,27 +5466,33 @@ public class Activity extends ContextThemeWrapper /** * Activities that want to remain visible behind a translucent activity above them must call - * this method anytime before a return from {@link #onPause()}. If this call is successful - * then the activity will remain visible when {@link #onPause()} is called, and can continue to - * play media in the background, but it must stop playing and release resources prior to or - * within the call to {@link #onVisibleBehindCanceled()}. If this call returns false, the - * activity will not be visible in the background, and must release any media resources - * immediately. + * this method anytime between the start of {@link #onResume()} and the return from + * {@link #onPause()}. If this call is successful then the activity will remain visible after + * {@link #onPause()} is called, and is allowed to continue playing media in the background. + * + * <p>The actions of this call are reset each time that this activity is brought to the + * front. That is, every time {@link #onResume()} is called the activity will be assumed + * to not have requested visible behind. Therefore, if you want this activity to continue to + * be visible in the background you must call this method again. * * <p>Only fullscreen opaque activities may make this call. I.e. this call is a nop * for dialog and translucent activities. * - * <p>False will be returned any time this method is call between the return of onPause and + * <p>Under all circumstances, the activity must stop playing and release resources prior to or + * within a call to {@link #onVisibleBehindCanceled()} or if this call returns false. + * + * <p>False will be returned any time this method is called between the return of onPause and * the next call to onResume. * * @param visible true to notify the system that the activity wishes to be visible behind other * translucent activities, false to indicate otherwise. Resources must be * released when passing false to this method. - * @return the resulting visibiity state. If true the activity may remain visible beyond - * {@link #onPause()}. If false then the activity may not count on being visible behind - * other translucent activities, and must stop any media playback and release resources. - * Returning false may occur in lieu of a call to onVisibleBehindCanceled() so the return - * value must be checked. + * @return the resulting visibiity state. If true the activity will remain visible beyond + * {@link #onPause()} if the next activity is translucent or not fullscreen. If false + * then the activity may not count on being visible behind other translucent activities, + * and must stop any media playback and release resources. + * Returning false may occur in lieu of a call to {@link #onVisibleBehindCanceled()} so + * the return value must be checked. * * @see #onVisibleBehindCanceled() * @see #onBackgroundVisibleBehindChanged(boolean) diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 0646cce..7b28404 100755 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -1105,6 +1105,11 @@ final class ActivityStack { invalidateLastScreenshot(); } next.returningOptions = null; + + if (mActivityContainer.mActivityDisplay.mVisibleBehindActivity == next) { + // When resuming an activity, require it to call requestVisibleBehind() again. + mActivityContainer.mActivityDisplay.setVisibleBehindActivity(null); + } } private void setVisibile(ActivityRecord r, boolean visible) { @@ -3291,6 +3296,11 @@ final class ActivityStack { if (hasVisibleBehindActivity() && !mHandler.hasMessages(RELEASE_BACKGROUND_RESOURCES_TIMEOUT_MSG)) { final ActivityRecord r = getVisibleBehindActivity(); + if (r == topRunningActivityLocked(null)) { + // Don't release the top activity if it has requested to run behind the next + // activity. + return; + } if (DEBUG_STATES) Slog.d(TAG, "releaseBackgroundResources activtyDisplay=" + mActivityContainer.mActivityDisplay + " visibleBehind=" + r + " app=" + r.app + " thread=" + r.app.thread); |