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

            亚洲&#228;v永久无码精品天堂久久| 欧美精品一区二区久久| 一97日本道伊人久久综合影院| 久久久久亚洲精品日久生情| 欧美综合天天夜夜久久| 中文字幕精品无码久久久久久3D日动漫 | 伊色综合久久之综合久久| 日韩精品国产自在久久现线拍| 久久精品国产亚洲av影院| 亚洲综合精品香蕉久久网| 久久天天躁狠狠躁夜夜不卡| 久久笫一福利免费导航 | 久久se精品一区二区影院| 91久久婷婷国产综合精品青草 | 久久免费视频1| 大香伊人久久精品一区二区 | 99久久免费国产精品特黄| 久久久久亚洲AV无码专区桃色| 久久精品无码专区免费| 亚洲а∨天堂久久精品| 国产免费久久精品99re丫y| 偷偷做久久久久网站| 亚洲综合精品香蕉久久网| 久久久久无码精品国产| 狠狠色丁香婷婷综合久久来| 国产成人久久精品麻豆一区| 精品国产福利久久久| 久久99精品九九九久久婷婷| 亚洲精品97久久中文字幕无码 | 亚洲va国产va天堂va久久| 久久人人爽人人爽人人片AV麻豆 | 97精品国产91久久久久久| 久久精品国产精品青草app| 久久青青草原亚洲av无码| 亚洲国产精品无码久久久秋霞2| 久久精品成人国产午夜| 色欲综合久久躁天天躁| 精品久久久无码人妻中文字幕豆芽 | 国产精品99久久不卡| 亚洲欧美一区二区三区久久| 久久久一本精品99久久精品66|