summaryrefslogtreecommitdiff
path: root/core/java/android/app/ActivityThread.java
diff options
context:
space:
mode:
authorCharles Chen <charlesccchen@google.com>2020-04-24 02:55:31 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2020-04-24 02:55:31 +0000
commit56dfd7c64372bf019908dd85e858b76c06572f1d (patch)
tree79074931f6eba2ecaceccc117590869785cc1f40 /core/java/android/app/ActivityThread.java
parent3bd90df589e0d01feef3ca37e16d10ff11c84150 (diff)
parent700c2062a0e6890540c068c7cbe02ef08a886a54 (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.java27
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) {