Merge "Detach children when stopping app." into pi-dev

This commit is contained in:
Rob Carr
2018-04-30 20:00:39 +00:00
committed by Android (Google) Code Review
4 changed files with 24 additions and 11 deletions

View File

@@ -700,15 +700,9 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb
mIsCreating = false;
if (mSurfaceControl != null && !mSurfaceCreated) {
mSurface.release();
// If we are not in the stopped state, then the destruction of the Surface
// represents a visual change we need to display, and we should go ahead
// and destroy the SurfaceControl. However if we are in the stopped state,
// we can just leave the Surface around so it can be a part of animations,
// and we let the life-time be tied to the parent surface.
if (!mWindowStopped) {
mSurfaceControl.destroy();
mSurfaceControl = null;
}
mSurfaceControl.destroy();
mSurfaceControl = null;
}
}
} catch (Exception ex) {

View File

@@ -1626,6 +1626,10 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
if (parent != null) {
parent.onActivityStateChanged(this, state, reason);
}
if (state == STOPPING) {
mWindowContainerController.notifyAppStopping();
}
}
ActivityState getState() {

View File

@@ -671,6 +671,17 @@ public class AppWindowContainerController
}
}
public void notifyAppStopping() {
synchronized(mWindowMap) {
if (mContainer == null) {
Slog.w(TAG_WM, "Attempted to notify stopping on non-existing app token: "
+ mToken);
return;
}
mContainer.detachChildren();
}
}
public void notifyAppStopped() {
synchronized(mWindowMap) {
if (mContainer == null) {

View File

@@ -913,12 +913,16 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree
// try and clean up it's child surfaces. We need to prevent this from
// happening, so we sever the children, transfering their ownership
// from the client it-self to the parent surface (owned by us).
detachChildren();
mPendingRelaunchCount++;
}
void detachChildren() {
for (int i = mChildren.size() - 1; i >= 0; i--) {
final WindowState w = mChildren.get(i);
w.mWinAnimator.detachChildren();
}
mPendingRelaunchCount++;
}
void finishRelaunching() {