diff options
| author | Charles Chen <charlesccchen@google.com> | 2020-04-24 02:55:31 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-04-24 02:55:31 +0000 |
| commit | 56dfd7c64372bf019908dd85e858b76c06572f1d (patch) | |
| tree | 79074931f6eba2ecaceccc117590869785cc1f40 /core/java/android/app/ActivityThread.java | |
| parent | 3bd90df589e0d01feef3ca37e16d10ff11c84150 (diff) | |
| parent | 700c2062a0e6890540c068c7cbe02ef08a886a54 (diff) | |
Merge "Revert "Fix false positive of activity leak in NexusLauncherTests"" into rvc-dev
Diffstat (limited to 'core/java/android/app/ActivityThread.java')
| -rw-r--r-- | core/java/android/app/ActivityThread.java | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 7d6ce41763d7..bea85a9974d9 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -4977,8 +4977,10 @@ public final class ActivityThread extends ClientTransactionHandler { ActivityClientRecord performDestroyActivity(IBinder token, boolean finishing, int configChanges, boolean getNonConfigInstance, String reason) { ActivityClientRecord r = mActivities.get(token); + Class<? extends Activity> activityClass = null; if (localLOGV) Slog.v(TAG, "Performing finish of " + r); if (r != null) { + activityClass = r.activity.getClass(); r.activity.mConfigChangeFlags |= configChanges; if (finishing) { r.activity.mFinished = true; @@ -5031,6 +5033,7 @@ public final class ActivityThread extends ClientTransactionHandler { synchronized (mResourcesManager) { mActivities.remove(token); } + StrictMode.decrementExpectedActivityCount(activityClass); return r; } @@ -5050,7 +5053,6 @@ public final class ActivityThread extends ClientTransactionHandler { ActivityClientRecord r = performDestroyActivity(token, finishing, configChanges, getNonConfigInstance, reason); if (r != null) { - Class<? extends Activity> activityClass = r.activity.getClass(); cleanUpPendingRemoveWindows(r, finishing); WindowManager wm = r.activity.getWindowManager(); View v = r.activity.mDecor; @@ -5075,14 +5077,14 @@ public final class ActivityThread extends ClientTransactionHandler { } if (wtoken != null && r.mPendingRemoveWindow == null) { WindowManagerGlobal.getInstance().closeAll(wtoken, - activityClass.getName(), "Activity"); + r.activity.getClass().getName(), "Activity"); } else if (r.mPendingRemoveWindow != null) { // We're preserving only one window, others should be closed so app views // will be detached before the final tear down. It should be done now because // some components (e.g. WebView) rely on detach callbacks to perform receiver // unregister and other cleanup. WindowManagerGlobal.getInstance().closeAllExceptView(token, v, - activityClass.getName(), "Activity"); + r.activity.getClass().getName(), "Activity"); } r.activity.mDecor = null; } @@ -5094,23 +5096,18 @@ public final class ActivityThread extends ClientTransactionHandler { // about leaking windows, because that is a bug, so if they are // using this recreate facility then they get to live with leaks. WindowManagerGlobal.getInstance().closeAll(token, - activityClass.getName(), "Activity"); + r.activity.getClass().getName(), "Activity"); } // Mocked out contexts won't be participating in the normal // process lifecycle, but if we're running with a proper // ApplicationContext we need to have it tear down things // cleanly. - final ContextImpl impl = ContextImpl.getImpl(r.activity); - if (impl != null) { - impl.scheduleFinalCleanup(activityClass.getName(), "Activity"); + Context c = r.activity.getBaseContext(); + if (c instanceof ContextImpl) { + ((ContextImpl) c).scheduleFinalCleanup( + r.activity.getClass().getName(), "Activity"); } - - r.activity = null; - r.window = null; - r.hideForNow = false; - r.nextIdle = null; - StrictMode.decrementExpectedActivityCount(activityClass); } if (finishing) { try { @@ -5340,6 +5337,10 @@ public final class ActivityThread extends ClientTransactionHandler { handleDestroyActivity(r.token, false, configChanges, true, reason); + r.activity = null; + r.window = null; + r.hideForNow = false; + r.nextIdle = null; // Merge any pending results and pending intents; don't just replace them if (pendingResults != null) { if (r.pendingResults == null) { |
