免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Android 之 Window、WindowManager 與窗口管理
分類: Android 2011-06-25 20:49 10062人閱讀 評(píng)論(10) 收藏 舉報(bào)

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

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

      * addView(); 

     * updateViewLayout();

     * removeView();

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

Window:

Windowandroid中的窗口,表示頂級(jí)窗口的意思,也就是主窗口,它有兩個(gè)實(shí)現(xiàn)類,PhoneWindowMidWindow,我們一般的activity對(duì)應(yīng)的主要是PhoneWindow,在activity中經(jīng)常使用的setContentView等方法也是在這個(gè)里面實(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ā)生變化時(shí)更新

        }

    }

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

我們?cè)賮砜纯?/span>ActivityThead中的兩個(gè)重要的方法(至于ActivityThead將在一篇中詳細(xì)介紹)

           performLaunchActivity( );

            handleResumeActivity( );

performLaunchActivity中,會(huì)調(diào)用activity.attach方法建立一個(gè)window, 在handleResumeActivity方法中啟動(dòng)activity的時(shí)候,會(huì)將主窗口加入到WindowManager

             View decor =r.window.getDecorView();  //獲得窗口的頂級(jí)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í)際上是把主窗口的頂級(jí)view加入到WindowMangaer

      }

我們?cè)賮砜纯?/span>WindowManager。

WindowManager:

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

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

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

     * addView(); 

     * updateViewLayout();

     * removeView();  

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

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

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

并且打開會(huì)話(IWindowSession),之后Window將通過該會(huì)話與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ì)就是一個(gè)Handler,窗口中View的事件處理、消息發(fā)送、回調(diào)等將通過ViewRoot來處理。

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

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Android 開發(fā)之漫漫長途 Ⅳ——Activity 的顯示之 ViewRootImpl 初探
android.view.ViewGroup.LayoutParams介紹
Android全面解析之Window機(jī)制
Android 帶你徹底理解 Window 和 WindowManager
android界面框架-Window
Android Studio 全屏沉浸式透明狀態(tài)欄效果
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服