Dialog窗口機制

Dialog創(chuàng)建

如下是Dialog類的構(gòu)造函數(shù)伞租,代碼有缺势N:

    Dialog(@UiContext @NonNull Context context, @StyleRes int themeResId,
            boolean createContextThemeWrapper) {
        
        //獲取WindowManager
        mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

        final Window w = new PhoneWindow(mContext);
        mWindow = w;
        //將新創(chuàng)建 Dialog 的 window 關(guān)聯(lián)到 Activity 的 WindowManager
        w.setWindowManager(mWindowManager, null, null);
    }

它創(chuàng)建了一個 Window灶挟,而這個 Window 的實現(xiàn)類是 PhoneWindow坏逢,它跟 Activity 一樣也是用 PhoneWindow 作為自己的 Window赃承。

得出結(jié)論:

結(jié)論1:Dialog 與 Activity 共用一個 WindowManager 對象
結(jié)論2:Dialog 擁有自己的窗口 Window(PhoneWindow 類型)
結(jié)論3:Dialog 的 Window 由附屬的 Acitivty WindowManager 對象統(tǒng)一管理

Dialog展示

show方法部分代碼:

    public void show() {

        if (!mCreated) {
            dispatchOnCreate(null);
        } else {
            final Configuration config = mContext.getResources().getConfiguration();
            mWindow.getDecorView().dispatchConfigurationChanged(config);
        }

        onStart();
        //獲取當前新Window的DecorView對象
        mDecor = mWindow.getDecorView();
        //獲取新Window的WindowManager.LayoutParams參數(shù)
        WindowManager.LayoutParams l = mWindow.getAttributes();
        //把一個View添加到與Activity共用的windowManager里
        mWindowManager.addView(mDecor, l);
        mShowing = true;
    }

由于Dialog 與 Activity 共用一個 WindowManager 對象妙黍,所以Activity與Dialog共用同一個mAppToken值(只是Dialog和Activity的Window對象不同)。添加過程與Activity 窗口添加過程 保持一致瞧剖。

Dialog 銷毀

dialog銷毀調(diào)用了自身dismiss()方法里面的dismissDialog()方法拭嫁,部分代碼如下:

    void dismissDialog() {
        try {
            mWindowManager.removeViewImmediate(mDecor);
        } finally {
            mDecor = null;
            mWindow.closeAllPanels();
            onStop();
            mShowing = false;
            sendDismissMessage();
        }
    }

mWindowManager 實際上是 WindowManagerImpl 的實例,所以這里的 removeViewImmediate()就是 WindowManagerImpl 中移除 View 的方法抓于,跟Activity 窗口銷毀過程 十分類似做粤,最終將 DecorView 從 PhoneWindow 中刪除完成。

Dialog 使用的 Context 不是 Activity 的而是 Application會怎么樣毡咏?

報錯顯示驮宴,提示token is null。


這里報錯的原因是沒有應(yīng)用 token 所導致的呕缭,應(yīng)用 token 一般只有 Activity 才擁有堵泽,所以這里只用用 Activity 的 Context 來作為 Dialog 的就可以了修己;這里因為 Appliation 的 token 是空的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迎罗,一起剝皮案震驚了整個濱河市睬愤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纹安,老刑警劉巖尤辱,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異厢岂,居然都是意外死亡光督,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進店門塔粒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來结借,“玉大人,你說我怎么就攤上這事卒茬〈希” “怎么了?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵圃酵,是天一觀的道長柳畔。 經(jīng)常有香客問我,道長郭赐,這世上最難降的妖魔是什么薪韩? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮堪置,結(jié)果婚禮上躬存,老公的妹妹穿的比我還像新娘。我一直安慰自己舀锨,他們只是感情好岭洲,可當我...
    茶點故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坎匿,像睡著了一般盾剩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上替蔬,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天告私,我揣著相機與錄音,去河邊找鬼承桥。 笑死驻粟,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的凶异。 我是一名探鬼主播蜀撑,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼挤巡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了酷麦?” 一聲冷哼從身側(cè)響起矿卑,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沃饶,沒想到半個月后母廷,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡糊肤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年琴昆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馆揉。...
    茶點故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡椎咧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出把介,到底是詐尸還是另有隱情,我是刑警寧澤蟋座,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布拗踢,位于F島的核電站,受9級特大地震影響向臀,放射性物質(zhì)發(fā)生泄漏巢墅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一券膀、第九天 我趴在偏房一處隱蔽的房頂上張望君纫。 院中可真熱鬧,春花似錦芹彬、人聲如沸蓄髓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽会喝。三九已至,卻和暖如春玩郊,著一層夾襖步出監(jiān)牢的瞬間肢执,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工译红, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留预茄,地道東北人。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓侦厚,卻偏偏與公主長得像耻陕,于是被迫代替她去往敵國和親拙徽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,587評論 2 350

推薦閱讀更多精彩內(nèi)容