Android 之 Window、WindowManager 與視窗管理

來源:互聯網
上載者:User

這篇是對前兩天研究的懸浮窗的內容的一個小小的資料整理吧。首先是轉載一篇介紹Android視窗的內容,覺得寫得不錯:http://blog.csdn.net/xieqibao/article/details/6567814

為防止丟失還是把內容也拷一遍吧(*^__^*) 嘻嘻……

其實在android中真正展示給使用者的是window和view,activity在android中所其的作用主要是處理一些邏輯問題,比如生命週期的管理、建立視窗等。在android中,視窗的管理還是比較重要的一塊,因為他直接負責把內容展示給使用者,並和使用者進行互動。響應使用者的輸入等。

在講視窗管理時,有必要先說下ViewManager這個介面,這個介面主要有以下的實現子介面和實作類別,分別是:WindowManager和ViewGroup裡面還有三個重要的方法:

  • addView(); 
  • updateViewLayout();
  • removeView();

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

Window:

Window是android中的視窗,表示最上層視窗的意思,也就是主視窗,它有兩個實作類別,PhoneWindow和MidWindow,我們一般的activity對應的主要是PhoneWindow,在activity中經常使用的setContentView等方法也是在這個裡面實現的。

(mContentParent == Callback cb = (cb != cb.onContentChanged(); } View Code

 每個主視窗中都有一個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(); ViewManager wm= a.getWindowManager(); WindowManager.LayoutParams l= a.mDecor = l.type = l.softInputMode |= a.mWindowAdded = wm.addView(decor, l); }View Code

我們再來看看WindowManager。

WindowManager:

WindowManager主要用來管理視窗的一些狀態、屬性、view增加、刪除、更新、視窗順序、訊息收集和處理等。

通過Context.getSystemService(Context.WINDOW_SERVICE)的方式可以獲得WindowManager的執行個體.

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

  • addView(); 
  • updateViewLayout();
  • removeView();  

在WindowManager中還有一個重要的靜態類LayoutParams.通過它可以設定和獲得當前視窗的一些屬性。

我們先來看看addView()方法,在addView中,會利用LayoutParams獲得window的View屬性,並為每個window建立ViewRoot,ViewRoot是View和WindowManager之間的橋樑,真正把View傳遞給WindowManager的是通過ViewRoot的setView()方法,ViewRoot實現了View和WindowManager之間的訊息傳遞。在將主視窗添加到WindowManger時,它首先會建立一個代理對象:

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

並且開啟會話(IWindowSession),之後Window將通過該會話與WindowManager建立聯絡,

來看下setView方法:

res = mAdded = mView = mAttachInfo.mRootView = newRuntimeException("Adding window failed" }View Code

在這段代碼中,ViewRoot通過IWindowSession把視窗添加到WindowManager中。ViewRoot繼承了Handler,實際上它的本質就是一個Handler,視窗中View的事件處理、訊息發送、回調等將通過ViewRoot來處理。

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

 

知道原理之後添加懸浮窗的工作就比較簡單了,主要關鍵點有以下幾個:

1. 首先是AndroidManifest.xml檔案中添加許可權<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

2. 擷取WindowManager視窗mWindowManager = (WindowManager)getApplication().getSystemService(getApplication().WINDOW_SERVICE);

3. 設定視窗屬性:

wmParams.type = wmParams.format = wmParams.flags = wmParams.gravity = Gravity.LEFT | wmParams.x = 0 wmParams.y = 0 wmParams.width = wmParams.height = LayoutInflater inflater = mFloatLayout = (LinearLayout) inflater.inflate(R.layout.float_layout, mWindowManager.addView(mFloatLayout, wmParams); View Code

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.