Merge "Close leaked windows when trying to preserve main one" into nyc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
4ef107bb7a
@@ -4183,12 +4183,10 @@ public final class ActivityThread {
|
|||||||
// window is being added.
|
// window is being added.
|
||||||
r.mPendingRemoveWindow = r.window;
|
r.mPendingRemoveWindow = r.window;
|
||||||
r.mPendingRemoveWindowManager = wm;
|
r.mPendingRemoveWindowManager = wm;
|
||||||
if (r.mPreserveWindow) {
|
|
||||||
// We can only keep the part of the view hierarchy that we control,
|
// We can only keep the part of the view hierarchy that we control,
|
||||||
// everything else must be removed, because it might not be able to
|
// everything else must be removed, because it might not be able to
|
||||||
// behave properly when activity is relaunching.
|
// behave properly when activity is relaunching.
|
||||||
r.window.clearContentView();
|
r.window.clearContentView();
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
wm.removeViewImmediate(v);
|
wm.removeViewImmediate(v);
|
||||||
}
|
}
|
||||||
@@ -4196,6 +4194,13 @@ public final class ActivityThread {
|
|||||||
if (wtoken != null && r.mPendingRemoveWindow == null) {
|
if (wtoken != null && r.mPendingRemoveWindow == null) {
|
||||||
WindowManagerGlobal.getInstance().closeAll(wtoken,
|
WindowManagerGlobal.getInstance().closeAll(wtoken,
|
||||||
r.activity.getClass().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,
|
||||||
|
r.activity.getClass().getName(), "Activity");
|
||||||
}
|
}
|
||||||
r.activity.mDecor = null;
|
r.activity.mDecor = null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -391,17 +391,34 @@ public final class WindowManagerGlobal {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove all roots with specified token.
|
||||||
|
*
|
||||||
|
* @param token app or window token.
|
||||||
|
* @param who name of caller, used in logs.
|
||||||
|
* @param what type of caller, used in logs.
|
||||||
|
*/
|
||||||
public void closeAll(IBinder token, String who, String what) {
|
public void closeAll(IBinder token, String who, String what) {
|
||||||
|
closeAllExceptView(token, null /* view */, who, what);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove all roots with specified token, except maybe one view.
|
||||||
|
*
|
||||||
|
* @param token app or window token.
|
||||||
|
* @param view view that should be should be preserved along with it's root.
|
||||||
|
* Pass null if everything should be removed.
|
||||||
|
* @param who name of caller, used in logs.
|
||||||
|
* @param what type of caller, used in logs.
|
||||||
|
*/
|
||||||
|
public void closeAllExceptView(IBinder token, View view, String who, String what) {
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
int count = mViews.size();
|
int count = mViews.size();
|
||||||
//Log.i("foo", "Closing all windows of " + token);
|
|
||||||
for (int i = 0; i < count; i++) {
|
for (int i = 0; i < count; i++) {
|
||||||
//Log.i("foo", "@ " + i + " token " + mParams[i].token
|
if ((view == null || mViews.get(i) != view)
|
||||||
// + " view " + mRoots[i].getView());
|
&& (token == null || mParams.get(i).token == token)) {
|
||||||
if (token == null || mParams.get(i).token == token) {
|
|
||||||
ViewRootImpl root = mRoots.get(i);
|
ViewRootImpl root = mRoots.get(i);
|
||||||
|
|
||||||
//Log.i("foo", "Force closing " + root);
|
|
||||||
if (who != null) {
|
if (who != null) {
|
||||||
WindowLeaked leak = new WindowLeaked(
|
WindowLeaked leak = new WindowLeaked(
|
||||||
what + " " + who + " has leaked window "
|
what + " " + who + " has leaked window "
|
||||||
|
|||||||
Reference in New Issue
Block a user