• <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>

            大龍的博客

            常用鏈接

            統(tǒng)計

            最新評論

            Android 之 Window、WindowManager 與窗口管理

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

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

                  * addView(); 

                 * updateViewLayout();

                 * removeView();

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

            Window:

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

                @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(); //窗口類容發(fā)生變化時更新

                    }

                }

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

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

                       performLaunchActivity( );

                        handleResumeActivity( );

            performLaunchActivity中,會調(diào)用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主要用來管理窗口的一些狀態(tài)、屬性、view增加、刪除、更新、窗口順序、消息收集和處理等。

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

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

                 * addView(); 

                 * updateViewLayout();

                 * removeView();  

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

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

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

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

            來看下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,實際上它的本質(zhì)就是一個Handler,窗口中View的事件處理、消息發(fā)送、回調(diào)等將通過ViewRoot來處理。

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

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

            久久亚洲精品无码aⅴ大香| 久久精品三级视频| 久久久亚洲欧洲日产国码二区 | 国产免费久久精品99久久| 国产精品伦理久久久久久| 久久精品国产亚洲AV蜜臀色欲| A狠狠久久蜜臀婷色中文网| 久久精品国产福利国产琪琪| 亚洲午夜久久久| Xx性欧美肥妇精品久久久久久| 久久无码国产| 久久精品免费观看| 日日噜噜夜夜狠狠久久丁香五月| 亚洲国产天堂久久综合网站| 亚洲国产另类久久久精品小说| 一级做a爱片久久毛片| 色综合久久久久综合体桃花网 | 国产精品免费看久久久香蕉| 国产偷久久久精品专区| 久久精品成人一区二区三区| 久久99国产综合精品免费| 亚洲&#228;v永久无码精品天堂久久| 久久香蕉超碰97国产精品| 亚洲精品成人网久久久久久| 四虎国产精品免费久久久| 久久免费的精品国产V∧| 久久天天躁夜夜躁狠狠躁2022| 久久精品视屏| 亚洲嫩草影院久久精品| 99久久国语露脸精品国产| 熟妇人妻久久中文字幕| 久久精品国产亚洲AV忘忧草18| 青春久久| 国产精品99久久久精品无码| 久久影视国产亚洲| 思思久久99热只有频精品66| 亚洲午夜无码久久久久小说| 欧美精品丝袜久久久中文字幕 | 久久Av无码精品人妻系列| 亚洲va久久久噜噜噜久久天堂| 伊人久久精品无码av一区|