• <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 大龍 閱讀(1344) 評論(0)  編輯 收藏 引用

            青青草国产精品久久久久| 久久亚洲精品视频| 青青草原综合久久大伊人| 综合人妻久久一区二区精品| 亚洲AV无码1区2区久久| 国产精品美女久久久免费| 香蕉久久久久久狠狠色| 狠狠色丁香久久综合婷婷| 要久久爱在线免费观看| 精品免费tv久久久久久久| 欧美日韩精品久久久免费观看 | 久久国产精品国产自线拍免费| 国产日韩欧美久久| 久久精品无码专区免费东京热| 久久毛片免费看一区二区三区| 国产精品女同久久久久电影院| 日韩AV毛片精品久久久| 久久青草国产手机看片福利盒子| 亚洲色欲久久久综合网东京热| 久久久久久无码国产精品中文字幕| 久久人人妻人人爽人人爽| 亚洲国产成人久久综合碰| 久久综合久久综合九色| 国产精品久久久久天天影视| 亚洲va久久久噜噜噜久久男同| 无码任你躁久久久久久久| 99久久精品免费国产大片| 久久国产乱子伦精品免费强| 亚洲狠狠婷婷综合久久久久| 久久久国产视频| 久久天天躁狠狠躁夜夜躁2014| 人妻无码精品久久亚瑟影视| 色天使久久综合网天天| 久久影视国产亚洲| 一级做a爰片久久毛片免费陪 | 久久高清一级毛片| 精品久久久久一区二区三区| 色综合久久久久| 日本加勒比久久精品| 亚洲人成电影网站久久| 午夜精品久久久久久中宇|