淺談Android Dialog窗口機制
問題引出
//創(chuàng)建dialog 方式一 AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this); // 創(chuàng)建dialog 方式二 AlertDialog.Builderbuilder=new AlertDialog.Builder(getApplicationContex());
區(qū)別在構(gòu)造時候于一個傳當(dāng)前activity 一個Application。第二種方式報錯。那么區(qū)別在哪兒呢?
Dialog 與 Activity 共用一個 WindowManager 對象,所以Activity與Dialog共用同一個mAppToken值。所以在創(chuàng)建Dialog 時,如果傳的Context是Application
Dialog源碼分析
構(gòu)造方法
構(gòu)造方法中有三個比較重要的函數(shù),可以自己去源碼中查看
// 步驟1. 獲取WindowManager對象 mWindowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); // 步驟2. 為Dialog創(chuàng)建新的Window Window w = PolicyManager.makeNewWindow(mContext); mWindow = w; // 步驟3. 關(guān)聯(lián)WindowManager與新Window // 注:第二個參數(shù)token為null,即一個Window屬于Dialog的話,那么該Window的傳入的mAppToken對象是null,Dialog沒有自己的token w.setWindowManager(mWindowManager, null, null);
- 步驟1:因為 context 是Activity,所以獲取到的 WindowManager 屬于 Activity,所以** Dialog 與 Activity 共用一個 WindowManager 對象**
- 步驟2:獲得 Activity 的WindowManager對象后,Dialog 又新建了一個 Window對象(PhoneWindow 類型,創(chuàng)建過程類似于 Activity 的 Window 創(chuàng)建過程)
- 步驟3:將新創(chuàng)建 Dialog 的 window 關(guān)聯(lián)到 Activity 的 WindowManager。特別注意的是:關(guān)于AppToken,只是Window的傳入的mAppToken對象是null,但不代表Dialog的window無token,
所以得出結(jié)論
- 結(jié)論1:Dialog 與 Activity 共用一個 WindowManager 對象
- 結(jié)論2:Dialog 擁有自己的窗口 Window(PhoneWindow 類型)
- 結(jié)論3:Dialog 的 Window 由附屬的 Acitivty WindowManager 對象統(tǒng)一管理
show()方法
// 1. 調(diào)用 Dialog的onCreate()
dispatchOnCreate(null);
// 2. 調(diào)用Dialog的onStart()
onStart();
// 3. 獲取當(dāng)前新Window的DecorView對象(類似于Activity)
mDecor = mWindow.getDecorView();
// 4. 獲取新Window的WindowManager.LayoutParams參數(shù)
WindowManager.LayoutParams l = mWindow.getAttributes();
// 5. 把一個View添加到與Activity共用的windowManager里
mWindowManager.addView(mDecor, l);- Dialog獲取當(dāng)前新Window的DecorView對象時過程類似于Activity,所以有一種自定義Dialog布局的方式就是重寫Dialog的onCreate方法,使用setContentView傳入布局,類似于 Activity。
- 步驟4:由于Dialog 與 Activity 共用一個 WindowManager 對象,所以Activity與Dialog共用同一個mAppToken值(只是Dialog和Activity的Window對象不同)。
- 步驟5:添加過程與Activity 窗口添加過程 保持一致。
到此這篇關(guān)于淺談Android Dialog窗口機制的文章就介紹到這了,更多相關(guān)Android Dialog窗口機制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android手勢滑動實現(xiàn)ImageView縮放圖片大小
這篇文章主要為大家詳細(xì)介紹了Android手勢滑動實現(xiàn)ImageView縮放圖片大小的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-02-02
Android開發(fā)之多線程中實現(xiàn)利用自定義控件繪制小球并完成小球自動下落功能實例
這篇文章主要介紹了Android開發(fā)之多線程中實現(xiàn)利用自定義控件繪制小球并完成小球自動下落功能的方法,涉及Android多線程編程及圖形繪制相關(guān)技巧,需要的朋友可以參考下2015-12-12
android webview獲取html代碼和根據(jù)id獲取value實例
這篇文章主要介紹了android webview獲取html代碼和根據(jù)id獲取value實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03
解析Android中View轉(zhuǎn)換為Bitmap及getDrawingCache=null的解決方法
在android中經(jīng)常會遇到View轉(zhuǎn)換為Bitmap的情形,本篇文章主要介紹了Android中View轉(zhuǎn)換為Bitmap及getDrawingCache=null的解決方法,有需要的可以了解一下。2016-11-11
anroid開發(fā)教程之spinner下拉列表的使用示例
這篇文章主要介紹了anroid的spinner下拉列表的使用示例,需要的朋友可以參考下2014-04-04
XListView實現(xiàn)下拉刷新和上拉加載原理解析
這篇文章主要為大家解析了XListView實現(xiàn)下拉刷新和上拉加載原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12

