浮窗開發(fā)之窗口層級

最近在項目中遇到了這樣的需求:需要在特定的其他應用之上懸浮自己的UI交互(拖動流椒、輸入等復雜的UI交互),和九游的浮窗類似明也,不過我們的比九游的體驗更好镣隶,我們越過了很多授權(quán)的限制。

浮窗效果

很多人都知道如何去實現(xiàn)一個簡單的浮窗诡右,但是卻很少有人去深入的研究背后的流程機制,由于項目中浮窗交互比較復雜轻猖,遇到了些坑查看了很多資料帆吻,故總結(jié)浮窗涉及到的知識點:

  • 窗口層級關(guān)系(浮窗是如何“浮”的)?
  • 浮窗有哪些限制咙边,如何越過用戶授權(quán)實現(xiàn)浮窗功能猜煮?
  • 窗口與用戶輸入系統(tǒng)(Activity是如何接收到touch事件的)次员?

本章我們來研究第一個問題:浮窗為何會浮。浮窗之所以叫浮窗王带,是因為它能懸浮于應用或者桌面窗口之上淑蔚,能脫離Activity而存在。為了研究其中區(qū)別愕撰,我們先來看看我們最熟悉的Activity是怎么顯示出來的刹衫。

Activity是怎么顯示出來的?

要弄清這個問題答案搞挣,我們先從Activity的setContentView()這個方法的源碼開始找起带迟,在Activity中看到setCententView的源碼:

public void setContentView(int layoutResID) {
    getWindow().setContentView(layoutResID);
    initWindowDecorActionBar();
}

getWindow是返回返回Activity的mWindow變量,指向一個Window的對象囱桨,Window是一個抽象類仓犬,這里返回的是PhoneWindow對象(PhoneWindow是Window的子類),PhoneWindow中有一個DecorView對象舍肠,decorView成員搀继,這是一個FrameLayout,setContentView的子布局最終會添加到decorView中,這個decorView就是當前窗口的根視圖,這個根視圖是如何最終被繪制出來的翠语?在ActivityThread中有這樣一段代碼:

            l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
            l.softInputMode |= forwardBit;
            if (a.mVisibleFromClient) {
                a.mWindowAdded = true;
                wm.addView(decor, l);
            }

這個decorView叽躯,最終會被WindowManager.addView添加到繪制系統(tǒng)中,并類型是WindowManager.LayoutParams.TYPE_BASE_APPLICATION,這個參數(shù)決定了要繪制的窗口的z軸層次啡专,為了避免思維棧過深险毁,這里就不貼出詳細的源碼跟蹤過程了,直接給結(jié)論们童。
先來看看Activity和window的關(guān)系:

Activity-window.jpg

再來window和View的關(guān)系:


window-view.jpg

Activity窗口顯示過程:

Activity的顯示過程.png

說Activity是怎么顯示出來的畔况,其實是說Activity管理的View是怎么顯示出來的。最后再來總結(jié)一下:

一慧库、Activity通過setContentView設(shè)置的視圖是添加到PhoneWindow的根視圖decor中跷跪。

二、Window是一個抽象的概念齐板,Window關(guān)了了一個View(根視圖)吵瞻,最終被WindowManager管理的還是一個View(根視圖)和它的LayoutParams,視圖繪制刷新都是通過WindowManager(WindowManagerGlobal)與WindowManagerServiceIPC交互調(diào)用底層繪制的甘磨。

三橡羞、Activity是四大組件中唯一和窗體緊密聯(lián)系的組件(這是為什么會有初學者把Activity直接理解為繪制界面的原因),所有掌管的視圖只不過是一種window和Dialog济舆、Toast卿泽、墻紙所掌管的Window類型不一樣。

浮窗為什么會“浮”滋觉?

上面講到Activity的顯示過程其實已經(jīng)揭示了通用界面的顯示過程签夭,浮窗的顯示過程更為簡單:

通用窗體繪制過程.png

做過浮窗的同學應該都明白了齐邦,為啥浮窗能脫離Activity而顯示,本質(zhì)上我們是把一個View交給WindowManager來管理了第租,LayoutParams.type類型決定了這個View顯示窗口的類型措拇,不同類型顯示的窗口層次(z軸)是不一樣的。大方面來講可以分為應用窗口(APPLICATION_WINDOW)慎宾、子窗口(SUB_WINDOW)丐吓、系統(tǒng)窗口(SYSTEM_WINDOW)三種類型,應用窗口z軸范圍是1~99璧诵,子窗口的范圍是1001~1999汰蜘,系統(tǒng)窗口是(2000~2999),所以要實現(xiàn)浮動窗口我們只能在系統(tǒng)窗口范圍中實現(xiàn)之宿。


窗體類型

到這里我們對Android系統(tǒng)的窗口層次有個大致的了解了族操,Activity是Android應用的四大組件之一,描述的是應用的活動狀態(tài)和周期比被,受ActivityManagerService的管理色难;Window/View是圖形窗口的抽象模型,描述的是窗口的繪制信息等缀,受WindowManagerService的管理枷莉;Activity聚合Window來和圖形窗口產(chǎn)生聯(lián)系。文章旨在理解一下Android窗體系統(tǒng)的一個雛形尺迂,能力有限不能詳細跟蹤整個窗口體系的源碼笤妙,有興趣的可以自己深入,下一篇文章:《越過授權(quán)使用浮窗》噪裕。

DMEO

https://github.com/liuguangli/FloatUtil

作者聲明:本人只在簡書本人博客中發(fā)表文章蹲盘,轉(zhuǎn)載需聯(lián)系本人取得同意!讀者閱讀時若出現(xiàn)排版混亂膳音、廣告等影響閱讀體驗說明不是原文召衔,建議到簡書本人博客中閱讀原文以取得更好的閱讀體驗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末祭陷,一起剝皮案震驚了整個濱河市苍凛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兵志,老刑警劉巖醇蝴,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異想罕,居然都是意外死亡哑蔫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闸迷,“玉大人,你說我怎么就攤上這事俘枫⌒裙粒” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵鸠蚪,是天一觀的道長今阳。 經(jīng)常有香客問我,道長茅信,這世上最難降的妖魔是什么盾舌? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蘸鲸,結(jié)果婚禮上妖谴,老公的妹妹穿的比我還像新娘。我一直安慰自己酌摇,他們只是感情好膝舅,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著窑多,像睡著了一般仍稀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上埂息,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天技潘,我揣著相機與錄音,去河邊找鬼千康。 笑死享幽,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的吧秕。 我是一名探鬼主播琉闪,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼砸彬!你這毒婦竟也來了颠毙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤砂碉,失蹤者是張志新(化名)和其女友劉穎蛀蜜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體增蹭,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡滴某,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霎奢。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡户誓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出幕侠,到底是詐尸還是另有隱情帝美,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布晤硕,位于F島的核電站悼潭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏舞箍。R本人自食惡果不足惜舰褪,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疏橄。 院中可真熱鬧占拍,春花似錦、人聲如沸软族。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽立砸。三九已至掖疮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間颗祝,已是汗流浹背浊闪。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留螺戳,地道東北人搁宾。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像倔幼,于是被迫代替她去往敵國和親盖腿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

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