乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Android 之 Window、WindowManager 與窗口管理

       老匹夫 2013-12-25
      分類: Android 2011-06-25 20:49 10062人閱讀 評論(10) 收藏 舉報

      其實(shí)在android中真正展示給用戶的是window和view,activity在android中所其的作用主要是處理一些邏輯問題,比如生命周期的管理、建立窗口等。在android中,窗口的管理還是比較重要的一塊,因?yàn)樗苯迂?fù)責(zé)把內(nèi)容展示給用戶,并和用戶進(jìn)行交互。響應(yīng)用戶的輸入等。

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

            * addView(); 

           * updateViewLayout();

           * removeView();

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

      Window:

      Windowandroid中的窗口,表示頂級窗口的意思,也就是主窗口,它有兩個實(shí)現(xiàn)類,PhoneWindowMidWindow,我們一般的activity對應(yīng)的主要是PhoneWindow,在activity中經(jīng)常使用的setContentView等方法也是在這個里面實(shí)現(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(實(shí)際上就是ViewGroup),在View中有兩個成員變量叫做mParent、mChildren,它是用來管理view的上下級關(guān)系的。而ViewGroup是對一組View的管理。因此,在ViewGroup中建立了所有view的關(guān)系網(wǎng)。而最終ViewGroup附屬在主窗口上。這樣就很容易在窗口中通過findViewById找到具體的View了。view中的事件處理也是根據(jù)這個路徑來處理的。

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

                 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);  //實(shí)際上是把主窗口的頂級view加入到WindowMangaer

            }

      我們再來看看WindowManager。

      WindowManager:

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

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

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

           * addView(); 

           * updateViewLayout();

           * removeView();  

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

      我們先來看看addView()方法,在addView中,會利用LayoutParams獲得windowView屬性,并為每個window創(chuàng)建ViewRoot,ViewRootViewWindowManager之間的橋梁,真正把View傳遞給WindowManager的是通過ViewRootsetView()方法,ViewRoot實(shí)現(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,實(shí)際上它的本質(zhì)就是一個Handler,窗口中View的事件處理、消息發(fā)送、回調(diào)等將通過ViewRoot來處理。

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

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多