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; mIsCreating = false;
if (mSurfaceControl != null && !mSurfaceCreated) { if (mSurfaceControl != null && !mSurfaceCreated) {
mSurface.release(); 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 mSurfaceControl.destroy();
// and destroy the SurfaceControl. However if we are in the stopped state, mSurfaceControl = null;
// 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;
}
} }
} }
} catch (Exception ex) { } catch (Exception ex) {

View File

@@ -1626,6 +1626,10 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo
if (parent != null) { if (parent != null) {
parent.onActivityStateChanged(this, state, reason); parent.onActivityStateChanged(this, state, reason);
} }
if (state == STOPPING) {
mWindowContainerController.notifyAppStopping();
}
} }
ActivityState getState() { 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() { public void notifyAppStopped() {
synchronized(mWindowMap) { synchronized(mWindowMap) {
if (mContainer == null) { 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 // try and clean up it's child surfaces. We need to prevent this from
// happening, so we sever the children, transfering their ownership // happening, so we sever the children, transfering their ownership
// from the client it-self to the parent surface (owned by us). // 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--) { for (int i = mChildren.size() - 1; i >= 0; i--) {
final WindowState w = mChildren.get(i); final WindowState w = mChildren.get(i);
w.mWinAnimator.detachChildren(); w.mWinAnimator.detachChildren();
} }
mPendingRelaunchCount++;
} }
void finishRelaunching() { void finishRelaunching() {