diff options
| -rw-r--r-- | services/core/java/com/android/server/wm/ActivityTaskManagerService.java | 11 | ||||
| -rw-r--r-- | services/core/java/com/android/server/wm/WindowProcessController.java | 10 |
2 files changed, 19 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 765c9d0a5864..7284e0f70b54 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -508,6 +508,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { */ private boolean mDidAppSwitch; + /** + * Last stop app switches time, apps finished before this time cannot start background activity + * even if they are in grace period. + */ + private long mLastStopAppSwitchesTime; + IActivityController mController = null; boolean mControllerIsAMonkey = false; @@ -4731,6 +4737,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { enforceCallerIsRecentsOrHasPermission(STOP_APP_SWITCHES, "stopAppSwitches"); synchronized (mGlobalLock) { mAppSwitchesAllowedTime = SystemClock.uptimeMillis() + APP_SWITCH_DELAY_TIME; + mLastStopAppSwitchesTime = SystemClock.uptimeMillis(); mDidAppSwitch = false; getActivityStartController().schedulePendingActivityLaunches(APP_SWITCH_DELAY_TIME); } @@ -4747,6 +4754,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } } + long getLastStopAppSwitchesTime() { + return mLastStopAppSwitchesTime; + } + void onStartActivitySetDidAppSwitch() { if (mDidAppSwitch) { // This is the second allowed switch since we stopped switches, so now just generally diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index 2ad25cf123e2..bc5e32823547 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -402,11 +402,17 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio if (mAllowBackgroundActivityStarts) { return true; } - // allow if any activity in the caller has either started or finished very recently + // allow if any activity in the caller has either started or finished very recently, and + // it must be started or finished after last stop app switches time. final long now = SystemClock.uptimeMillis(); if (now - mLastActivityLaunchTime < ACTIVITY_BG_START_GRACE_PERIOD_MS || now - mLastActivityFinishTime < ACTIVITY_BG_START_GRACE_PERIOD_MS) { - return true; + // if activity is started and finished before stop app switch time, we should not + // let app to be able to start background activity even it's in grace period. + if (mLastActivityLaunchTime > mAtm.getLastStopAppSwitchesTime() + || mLastActivityFinishTime > mAtm.getLastStopAppSwitchesTime()) { + return true; + } } // allow if the proc is instrumenting with background activity starts privs if (mInstrumentingWithBackgroundActivityStartPrivileges) { |