正文
removeViewLocked
(
int
index,
boolean
immediate)
{
ViewRootImpl root = mRoots.get(index);
View view = root.getView();
if
(view !=
null
) {
InputMethodManager imm = InputMethodManager.getInstance();
if
(imm !=
null
) {
imm.windowDismissed(mViews.get(index).getWindowToken());
}
}
boolean
deferred = root.die(immediate);
if
(view !=
null
) {
view.assignParent(
null
);
if
(deferred) {
mDyingViews.add(view);
}
}
}
注释1处根据传入的索引在ViewRootImpl列表中获得V的ViewRootImpl。注释2处得到InputMethodManager实例,如果InputMethodManager实例不为null则在注释3处调用InputMethodManager的windowDismissed方法来结束V的输入法相关的逻辑。注释4处调用ViewRootImpl 的die方法,如下所示。
frameworks/base/core/java/android/view/ViewRootImpl.java
boolean die(boolean immediate) {
if (immediate && !mIsInTraversal) {
doDie();
return false;
}
if (!mIsDrawing) {
destroyHardwareRenderer();
} else {
Log.e(mTag, "Attempting to destroy the window while drawing!\n" +
" window=" + this + ", title=" + mWindowAttributes.getTitle());
}
mHandler.sendEmptyMessage(MSG_DIE);
return true;
}
注释1处如果immediate为ture(需要立即执行),并且mIsInTraversal值为false则执行注释2处的代码,mIsInTraversal在执行ViewRootImpl的performTraversals方法时会被设置为true,在performTraversals方法执行完时被设置为false,因此注释1处可以理解为die方法需要立即执行并且此时ViewRootImpl不在执行performTraversals方法。注释2处的doDie方法如下所示。
frameworks/base/core/java/android/view/ViewRootImpl.java
void doDie() {
checkThread();
if (LOCAL_LOGV) Log.v(mTag, "DIE in "