<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                #### 8.2.1 Window的添加過程 Window的添加過程需要通過WindowManager的addView來實現,WindowManager是一個接口,它的真正實現是WindowManagerImpl類。在WindowManagerImpl中Window的三大操作的實現如下: @Override public void addView(View view, ViewGroup.LayoutParams params) { mGlobal.addView(view, params, mDisplay, mParentWindow); } @Override public void updateViewLayout(View view, ViewGroup.LayoutParams params) { mGlobal.updateViewLayout(view, params); } @Override public void removeView(View view) { mGlobal.removeView(view, false); } 可以發現,WindowManagerImpl并沒有直接實現Window的三大操作,而是全部交給了WindowManagerGlobal來處理,WindowManagerGlobal以工廠的形式向外提供自己的實例,在WindowManagerGlobal中有如下一段代碼:private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance()。WindowManagerImpl這種工作模式是典型的橋接模式,將所有的操作全部委托給WindowManagerGlobal來實現。WindowManager-Global的addView方法主要分為如下幾步。 * 1.檢查參數是否合法,如果是子Window那么還需要調整一些布局參數 if (view == null) { throw new IllegalArgumentException("view must not be null"); } if (display == null) { throw new IllegalArgumentException("display must not be null"); } if (! (params instanceof WindowManager.LayoutParams)) { throw new IllegalArgumentException("Params must be WindowManager. LayoutParams"); } final WindowManager.LayoutParams wparams = (WindowManager.LayoutParams) params; if (parentWindow ! = null) { parentWindow.adjustLayoutParamsForSubWindow(wparams); } * 2.創建ViewRootImpI并將View添加到列表中 在WindowManagerGlobal內部有如下幾個列表比較重要: private final ArrayList<View> mViews = new ArrayList<View>(); private final ArrayList<ViewRootImpl> mRoots = new ArrayList <ViewRootImpl>(); private final ArrayList<WindowManager.LayoutParams> mParams = new ArrayList<WindowManager.LayoutParams>(); private final ArraySet<View> mDyingViews = new ArraySet<View>(); 在上面的聲明中,mViews存儲的是所有Window所對應的View, mRoots存儲的是所有Window所對應的ViewRootImpl, mParams存儲的是所有Window所對應的布局參數,而mDyingViews則存儲了那些正在被刪除的View對象,或者說是那些已經調用removeView方法但是刪除操作還未完成的Window對象。在addView中通過如下方式將Window的一系列對象添加到列表中: root = new ViewRootImpl(view.getContext(), display); view.setLayoutParams(wparams); mViews.add(view); mRoots.add(root); mParams.add(wparams); * 3.通過ViewRootImpI來更新界面并完成Window的添加過程 這個步驟由ViewRootImpl的setView方法來完成,從第4章可以知道,View的繪制過程是由ViewRootImpl來完成的,這里當然也不例外,在setView內部會通過requestLayout來完成異步刷新請求。在下面的代碼中,scheduleTraversals實際是View繪制的入口: public void requestLayout() { if (! mHandlingLayoutInLayoutRequest) { checkThread(); mLayoutRequested = true; scheduleTraversals(); } } 接著會通過WindowSession最終來完成Window的添加過程。在下面的代碼中,mWindowSession的類型是IWindowSession,它是一個Binder對象,真正的實現類是Session,也就是Window的添加過程是一次IPC調用。 try { mOrigWindowType = mWindowAttributes.type; mAttachInfo.mRecomputeGlobalAttributes = true; collectViewAttributes(); res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes, getHostVisibility(), mDisplay.getDisplayId(), mAttachInfo.mContentInsets, mInputChannel); } catch (RemoteException e) { mAdded = false; mView = null; mAttachInfo.mRootView = null; mInputChannel = null; mFallbackEventHandler.setView(null); unscheduleTraversals(); setAccessibilityFocus(null, null); throw new RuntimeException("Adding window failed", e); } 在Session內部會通過WindowManagerService來實現Window的添加,代碼如下所示。 public int addToDisplay(IWindow window, int seq, WindowManager.LayoutParams attrs, int viewVisibility, int displayId, Rect outContentInsets, InputChannel outInputChannel) { return mService.addWindow(this, window, seq, attrs, viewVisibility, displayId, outContentInsets, outInputChannel); } 如此一來,Window的添加請求就交給WindowManagerService去處理了,在Window-ManagerService內部會為每一個應用保留一個單獨的Session。具體Window在Window-ManagerService內部是怎么添加的,本章不對其進行進一步的分析,這是因為到此為止我們對Window的添加這一流程已經清楚了,而在WindowManagerService內部主要是代碼細節,深入進去沒有太大的意義,讀者可以自行閱讀源碼或者參考相關的源碼分析書籍,本書對源碼的分析側重的是整體流程,會盡量避免出現深入代碼邏輯無法自拔的情形。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看