Android中Window新增View的底層原理
阿新 • • 發佈:2019-02-19
主要做四件事: 1.垃圾回收相關工作,比如清資料,回撥等。 2.通過Session的remove方法刪除Window,最終呼叫WindowManagerService的removeWindow 3.呼叫dispathDetachedFromWindow,在內部會呼叫onDetachedFromWindow()和onDetachedFromWindowInternal()。當view移除時會呼叫onDetachedFromWindow,它用於作一些資源回收。 4.通過doRemoveView重新整理資料,刪除相關資料,如在mRoot,mDyingViews中刪除物件等。void doDie() { checkThread(); if (LOCAL_LOGV) Log.v(TAG, "DIE in " + this + " of " + mSurface); synchronized (this) { if (mRemoved) { return; } mRemoved = true; if (mAdded) { dispatchDetachedFromWindow(); } if (mAdded && !mFirst) { destroyHardwareRenderer(); if (mView != null) { int viewVisibility = mView.getVisibility(); boolean viewVisibilityChanged = mViewVisibility != viewVisibility; if (mWindowAttributesChanged || viewVisibilityChanged) { // If layout params have been changed, first give them // to the window manager to make sure it has the correct // animation info. try { if ((relayoutWindow(mWindowAttributes, viewVisibility, false) & WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME) != 0) { mWindowSession.finishDrawing(mWindow); } } catch (RemoteException e) { } } mSurface.release(); } } mAdded = false; } WindowManagerGlobal.getInstance().doRemoveView(this); }
void doRemoveView(ViewRootImpl root) { synchronized (mLock) { final int index = mRoots.indexOf(root); if (index >= 0) { mRoots.remove(index); mParams.remove(index); final View view = mViews.remove(index); mDyingViews.remove(view); } } if (HardwareRenderer.sTrimForeground && HardwareRenderer.isAvailable()) { doTrimForeground(); } }