• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統計

            最新評論

            Android 之 Window、WindowManager 與窗口管理

            其實在android中真正展示給用戶的是window和view,activity在android中所其的作用主要是處理一些邏輯問題,比如生命周期的管理、建立窗口等。在android中,窗口的管理還是比較重要的一塊,因為他直接負責把內容展示給用戶,并和用戶進行交互。響應用戶的輸入等。

            在講窗口管理時,有必要先說下ViewManager這個接口,這個接口主要有以下的實現子接口和實現類,分別是:WindowManagerViewGroup里面還有三個重要的方法:

                  * addView(); 

                 * updateViewLayout();

                 * removeView();

            WindowManager中,addView方法表示的是將主窗口中的頂級view(也就是DecorView)添加到WindowManager中,并建立會話。接下來會詳細介紹。我們先來看看Window

            Window:

            Window是android中的窗口,表示頂級窗口的意思,也就是主窗口,它有兩個實現類,PhoneWindow和MidWindow,我們一般的activity對應的主要是PhoneWindow,在activity中經常使用的setContentView等方法也是在這個里面實現的。

                @Override

                public void setContentView(View view,ViewGroup.LayoutParams params) {

                    if (mContentParent == null) {

                        installDecor();

                    } else {

                        mContentParent.removeAllViews();

                    }

                    mContentParent.addView(view, params);

                    final Callback cb = getCallback();

                    if (cb != null) {

                       cb.onContentChanged(); //窗口類容發生變化時更新

                    }

                }

             每個主窗口中都有一個View,稱之為DecorView,是主窗口中的頂級view(實際上就是ViewGroup),在View中有兩個成員變量叫做mParent、mChildren,它是用來管理view的上下級關系的。而ViewGroup是對一組View的管理。因此,在ViewGroup中建立了所有view的關系網。而最終ViewGroup附屬在主窗口上。這樣就很容易在窗口中通過findViewById找到具體的View了。view中的事件處理也是根據這個路徑來處理的。

            我們再來看看ActivityThead中的兩個重要的方法(至于ActivityThead將在一篇中詳細介紹)

                       performLaunchActivity( );

                        handleResumeActivity( );

            performLaunchActivity中,會調用activity.attach方法建立一個window, 在handleResumeActivity方法中啟動activity的時候,會將主窗口加入到WindowManager

                         View decor =r.window.getDecorView(); //獲得窗口的頂級View

                  decor.setVisibility(View.INVISIBLE);

                  ViewManager wm= a.getWindowManager();    //WindowManager繼承自ViewManager

                  WindowManager.LayoutParams l =r.window.getAttributes();

                  a.mDecor = decor;

                  l.type =WindowManager.LayoutParams.TYPE_BASE_APPLICATION;

                 l.softInputMode |= forwardBit;

                 if (a.mVisibleFromClient) {

                     a.mWindowAdded = true;

                     wm.addView(decor, l); //實際上是把主窗口的頂級view加入到WindowMangaer

                  }

            我們再來看看WindowManager

            WindowManager:

            WindowManager主要用來管理窗口的一些狀態、屬性、view增加、刪除、更新、窗口順序、消息收集和處理等。

            通過Context.getSystemService(Context.WINDOW_SERVICE)的方式可以獲得WindowManager的實例.

            WindowManager繼承自ViewManager,里面涉及到窗口管理的三個重要方法,分別是:

                 * addView(); 

                 * updateViewLayout();

                 * removeView();  

            在WindowManager中還有一個重要的靜態類LayoutParams.通過它可以設置和獲得當前窗口的一些屬性。

            我們先來看看addView()方法,在addView中,會利用LayoutParams獲得windowView屬性,并為每個window創建ViewRootViewRootViewWindowManager之間的橋梁,真正把View傳遞給WindowManager的是通過ViewRootsetView()方法,ViewRoot實現了ViewWindowManager之間的消息傳遞。在將主窗口添加到WindowManger時,它首先會建立一個代理對象:

                          wm=(WindowManagerImpl)context.getSystemService(Context.WINDOW_SERVICE)

            并且打開會話(IWindowSession),之后Window將通過該會話與WindowManager建立聯系,

            來看下setView方法:

                     try {

                    res =sWindowSession.add(mWindow, mWindowAttributes,

                     getHostVisibility(), mAttachInfo.mContentInsets);

                 } catch (RemoteException e) {

                     mAdded = false;

                    mView = null;

                     mAttachInfo.mRootView =null;

                     unscheduleTraversals();

                     throw newRuntimeException("Adding window failed", e);

                  } finally {

                     if (restore) {

                        attrs.restore();

                     }

                  }

            在這段代碼中,ViewRoot通過IWindowSession把窗口添加到WindowManager中。ViewRoot繼承了Handler,實際上它的本質就是一個Handler,窗口中View的事件處理、消息發送、回調等將通過ViewRoot來處理。

            這樣就完成了把窗口添加到WindowManager中,并交由WindowManager來管理窗口的view、事件、消息收集處理等。

            posted on 2013-01-13 04:18 大龍 閱讀(1340) 評論(0)  編輯 收藏 引用

            久久国产免费观看精品3| 波多野结衣久久| 久久青青国产| AV无码久久久久不卡蜜桃| 欧美日韩中文字幕久久伊人| 国产精品久久久久一区二区三区| 精品久久久久久中文字幕大豆网 | 亚洲精品无码久久久久| 久久中文字幕一区二区| 少妇人妻88久久中文字幕| 久久国产成人亚洲精品影院| 麻豆成人久久精品二区三区免费| 久久精品国产亚洲综合色| 亚洲精品无码成人片久久| 欧美一级久久久久久久大| 国产欧美久久一区二区| 久久综合噜噜激激的五月天| 欧美久久综合九色综合| 久久精品国产福利国产秒| 午夜人妻久久久久久久久| 一本综合久久国产二区| 久久国产影院| 久久高潮一级毛片免费| 国产精品99久久久久久宅男| 久久线看观看精品香蕉国产| 久久天堂AV综合合色蜜桃网| 99久久精品国产一区二区 | 久久久无码精品亚洲日韩蜜臀浪潮| 久久综合九色综合久99| 精品国产热久久久福利| 久久久中文字幕| 99久久精品国产一区二区三区| 久久久老熟女一区二区三区| 亚洲精品乱码久久久久久久久久久久 | 国产精品激情综合久久| 亚洲综合精品香蕉久久网97| 久久这里只精品国产99热| 66精品综合久久久久久久| 国产精品免费久久| 久久久久久av无码免费看大片 | 久久w5ww成w人免费|