专栏名称: 刘望舒
腾讯云最具价值专家
目录
相关文章推荐
复利大王  ·  湘ya一骨科的瓜? ·  7 小时前  
复利大王  ·  冷暴力女王,翻车了 ·  昨天  
复利大王  ·  手握25w华子股票,躺平了 ·  昨天  
复利大王  ·  王石最新朋友圈 ·  2 天前  
51好读  ›  专栏  ›  刘望舒

Android解析WindowManagerService(三)Window的删除过程

刘望舒  · 掘金  · android  · 2018-02-06 04:16

正文

请到「今天看啥」查看全文


removeViewLocked ( int index, boolean immediate) { ViewRootImpl root = mRoots.get(index); //1 View view = root.getView(); if (view != null ) { InputMethodManager imm = InputMethodManager.getInstance(); //2 if (imm != null ) { imm.windowDismissed(mViews.get(index).getWindowToken()); //3 } } boolean deferred = root.die(immediate); //4 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) {
        //die方法需要立即执行并且此时ViewRootImpl不在执行performTraversals方法
        if (immediate && !mIsInTraversal) {//1
            doDie();//2
            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() {
    //检查执行doDie方法的线程的正确性
    checkThread();//1
    if (LOCAL_LOGV) Log.v(mTag, "DIE in "






请到「今天看啥」查看全文