From 82a91631d58d0d378ae93afc034aef3b44aef81b Mon Sep 17 00:00:00 2001 From: leo_hsu Date: Fri, 21 Mar 2014 12:27:16 +0800 Subject: [PATCH] [ActivityManager] Fix a bug: unable to start activity after starting activities during screen off. Symptom: Unable to start any activity. Root Cause: ActivityStack.mPausingActivity() points to a destroyed activity of a died process, so that ActivityStackSupervisor.allPausedActivitiesComplete() always returns false. Solution: Set mPausingActivity to null in ActivityStack.cleanUpActivityLocked(). Reproduce steps: a. Turn screen off. b. A background service starts an activity X (in process X). c. A background service starts a no-history activity Y (in process Y), but the main thread of Y was blocked. d. A background service starts Y 3~4 times --> this causes am_failed_to_pause on X. e. Main thread of Y is freed finally --> this causes Y crash for android.view.WindowManager$BadTokenException. f. Turn screen on, X is shown on screen, but neither back key nor home key can work because mPausingActivity is Y. Change-Id: I320b3db407e2d4cc745c8ca22a6e548742234242 --- services/java/com/android/server/am/ActivityStack.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java index d651a6217c493..6e176f0999893 100755 --- a/services/java/com/android/server/am/ActivityStack.java +++ b/services/java/com/android/server/am/ActivityStack.java @@ -2624,6 +2624,9 @@ final class ActivityStack { if (mResumedActivity == r) { mResumedActivity = null; } + if (mPausingActivity == r) { + mPausingActivity = null; + } if (mService.mFocusedActivity == r) { mService.mFocusedActivity = null; }