Android 之 Window、WindowManager 與視窗管理
其實在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等方法也是在這個裡面實現的。
@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獲得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方法:
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、事件、訊息收集處理等。
相關文章
- Android之Window與WindowManagerAndroid
- Android視窗管理分析(2):WindowManagerService視窗管理之Window新增流程Android
- Android顯示框架:Android應用視窗的管理者WindowManagerAndroid框架
- Window、WindowManager、View 之間的關係View
- Android解析WindowManager(二)Window的屬性Android
- 理解Window和WindowManager
- Window, WindowManager和WindowManagerService之間的關係
- 圖解Android - Android GUI 系統 (2) - 視窗管理 (View, Canvas, Window Manager)圖解AndroidGUIViewCanvas
- Android之Window和彈窗問題Android
- Cisdem Window Manager for Mac 視窗管理工具Mac
- android視窗管理剖析Android
- 帶你徹底理解 Android 中的 Window 和 WindowManagerAndroid
- Android解析WindowManager(一)WindowManager體系Android
- js實現window.open()彈出視窗和父視窗之間相互操作JS
- WindowManager$BadTokenException: Unable to add window permission denied for this window typeException
- Android 懸浮窗 System Alert WindowAndroid
- javascript獲取window視窗的尺寸JavaScript
- PostgreSQL 視窗函式 ( Window Functions ) 如何使用?SQL函式Function
- window.open()開啟新視窗教程
- pl/sql developer 顯示Window List視窗SQLDeveloper
- 顯示Pl/Sql Developer window list視窗SQLDeveloper
- Android視窗管理分析(3):視窗分組及Z-order的確定Android
- Android顯示框架:Android應用檢視的管理者WindowAndroid框架
- Android 8.0 原始碼分析 (十) WindowManagerService 的視窗管理Android原始碼
- android的視窗機制分析------UI管理系統AndroidUI
- JavaScript中的Window物件(開啟新的視窗)JavaScript物件
- PLSQL Developer中鎖定Window List視窗辦法SQLDeveloper
- EXTJS 視窗Ext.Window()學習筆記JS筆記
- 01-Tkinter教程-視窗的管理與設定
- 強悍的 ubuntu —— 視窗介面管理與設定Ubuntu
- 懸浮窗的一種實現 | Android懸浮窗Window應用Android
- JavaScript - 視窗之OpenJavaScript
- 如何編寫簡單的應用window視窗程式
- 閃回資料庫時間視窗(flashback database window)資料庫Database
- JavaScript視窗功能指南之操縱視窗 (轉)JavaScript
- js window.open()實現列印,如何在關閉列印視窗時重新整理父視窗JS
- Android 7.0 多視窗模式Android模式
- 防止window.open()函式彈出視窗被攔截函式