• <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)  編輯 收藏 引用

            久久精品国产亚洲精品2020| 久久久久国产一级毛片高清板| 久久久无码精品亚洲日韩京东传媒 | 欧美黑人又粗又大久久久| 成人国内精品久久久久一区| 久久成人精品| 久久天天躁夜夜躁狠狠躁2022| 成人久久久观看免费毛片| 久久夜色撩人精品国产| 老色鬼久久亚洲AV综合| 亚洲七七久久精品中文国产| 日韩一区二区久久久久久 | 99久久国产综合精品网成人影院| 色综合久久久久综合99| 97久久超碰国产精品旧版| 伊人热热久久原色播放www| 人人狠狠综合久久亚洲88| 久久精品国产亚洲AV不卡| 久久综合精品国产一区二区三区| 国产成人久久精品激情 | 欧美一区二区久久精品| 国产激情久久久久影院老熟女免费 | 久久精品国产精品青草app| 五月丁香综合激情六月久久| 性高朝久久久久久久久久| 久久久久这里只有精品| 97超级碰碰碰碰久久久久| 久久午夜电影网| 99久久综合狠狠综合久久止| 九九久久自然熟的香蕉图片| 嫩草伊人久久精品少妇AV| 久久久久女人精品毛片| 日本欧美久久久久免费播放网| 久久综合亚洲色一区二区三区| 久久午夜福利无码1000合集| 尹人香蕉久久99天天拍| 久久综合亚洲色一区二区三区| 久久精品极品盛宴观看| 久久国语露脸国产精品电影| 无码国产69精品久久久久网站| 亚洲精品乱码久久久久久蜜桃不卡 |