WMS中performLayoutAndPlaceSurfacesLockedInner方法在api 24前后的實現(xiàn)

1.簡述

? ? ? ?在很多分析WindowManagerService的文章中都把它稱為Android GUI系統(tǒng)的“導演“懒叛,那既然身為導演自然就需要做”指導工作、分析劇本“的工作谁榜,這些工作反應在GUI中就是計算window的大小叉寂、執(zhí)行動畫、更新surface等女揭。而這些關鍵工作在android api版本23以前(包括api 23)是由performLayoutAndPlaceSurfacesLockedInner這個方法實現(xiàn)的。

2.api ? 23以前的核心方法——performLayoutAndPlaceSurfacesLockedInner

? ? ? ?Android api 23以前在需要刷新系統(tǒng)UI的時候冒黑,例如切換Activity窗口田绑,需要調用WMS的成員函數(shù)performLayoutAndPlaceSurfacesLocked來實現(xiàn):

? ? ? ? 該方法中具體的實現(xiàn)是一個do while循環(huán)中的performLayoutAndPlaceSurfacesLockedLoop 方法,這個循環(huán)的次數(shù)是6(暫不清楚這個6是如何而來)抡爹。

? ? ? ? ?在這個方法中終于見到了WMS中最為復雜的方法performLayoutAndPlaceSurfacesLockedInner,這個近600行的代碼中包含了計算窗口大小芒划、執(zhí)行窗口動畫冬竟、刷新surface等工作欧穴。


? ? ? ? 關鍵的代碼在于這個try...catch中,里面對于窗口的變更進行計算泵殴,并且通過SurfaceControl對應到Surfacelinger中涮帘。 ?現(xiàn)在Android已經(jīng)逐漸開始支持多屏幕顯示,因此在這個方法里的先獲取到的DisplayContents的數(shù)量笑诅,然后在for循環(huán)中更新到每一個顯示屏幕中(目前基本上只有1)调缨。關于layout的計算都在do...while這個循環(huán)中,循環(huán)跳出的條件是displayContent.pendingLayoutChanges != 0吆你,也就是說當還有未處理的“l(fā)ayout changes”的時候會繼續(xù)執(zhí)行計算弦叶,而每輪循環(huán)末尾都會對這個displayContent.pendingLayoutChanges 進行賦值。當這個do...while結束之后進行的是對窗口需要執(zhí)行動畫的計算妇多,而后執(zhí)行各個窗口的動畫伤哺。

? ? ? ? 之后的代碼都屬于收尾工作,包括銷毀不可見的窗口者祖,刪除正在退出的WindowToken等立莉。

? ? ? ?最后執(zhí)行的是scheduleAnimationLocked,里面是觸發(fā)動畫下一幀的邏輯七问,具體就是在下一個vsync信號來時觸發(fā)調用計算窗口透明度蜓耻、尺寸、旋轉角度等值械巡,然后將這些值設置到SurfaceFlinger中媒熊。

? ? ? ?這么一個洋洋灑灑600行代碼的方法,使得開發(fā)者閱讀起來相當困難坟比,在維護上肯定也輕松不到哪里去芦鳍,估計谷歌也考慮到了這點,因此在api 24之后估計對這個方法進行了改造葛账,他們直接將WMS中的performLayoutAndPlaceSurfacesLockedInner方法去掉轉而新建了專門做計算的WindowSurfacePlacer類柠衅。

3.api 24之后的改動,WindowSurfacePlacer類分析

? ? ? ? WindowSurfacePlacer的出現(xiàn)原因可能是因為WMS的performLayoutAndPlaceSurfacesLockedInner方法過于臃腫影響可讀性(其實WindowSurfacePlacer里也沒好到哪兒去)籍琳,更重要的原因為了實現(xiàn)7.0中的多窗口功能菲宴。

? ? ? ?在api 24的WMS中出現(xiàn)了一個方法——continueSurfaceLayout。這個方法作用簡單來說就是布局趋急,跟進去后會發(fā)現(xiàn)它調用的是WindowSurfacePlacer的performSurfacePlacement喝峦,

? ? ? ? 繼而調用的是performSurfacePlacementLoop->performSurfacePlacementInner。是不是有點面熟呜达?沒錯谣蠢,原來WMS的窗口計算、通知繪制的邏輯被搬到了這兒。

? ? ? 與之前performLayoutAndPlaceSurfacesLockedInner不同的是眉踱,現(xiàn)在把do...while循環(huán)放到了更外層的方法中挤忙。至此WMS中最為復雜的方法分析告一段落,可見雖然方法比較復雜谈喳,但是條理還是非常清楚的册烈。后續(xù)的文章我還會繼續(xù)分析Android 7.0(api 24)上多窗口的三種模式(多屏模式、畫中畫模式婿禽、Freeform模式)的具體實現(xiàn)赏僧,當然與AMS,WMS息息相關扭倾。盡情期待淀零。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市吆录,隨后出現(xiàn)的幾起案子窑滞,更是在濱河造成了極大的恐慌,老刑警劉巖恢筝,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哀卫,死亡現(xiàn)場離奇詭異,居然都是意外死亡撬槽,警方通過查閱死者的電腦和手機此改,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侄柔,“玉大人共啃,你說我怎么就攤上這事≡萏猓” “怎么了移剪?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長薪者。 經(jīng)常有香客問我纵苛,道長,這世上最難降的妖魔是什么言津? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任攻人,我火速辦了婚禮,結果婚禮上悬槽,老公的妹妹穿的比我還像新娘怀吻。我一直安慰自己,他們只是感情好初婆,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布蓬坡。 她就那樣靜靜地躺著猿棉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪渣窜。 梳的紋絲不亂的頭發(fā)上铺根,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天宪躯,我揣著相機與錄音乔宿,去河邊找鬼。 笑死访雪,一個胖子當著我的面吹牛详瑞,可吹牛的內容都是我干的。 我是一名探鬼主播臣缀,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼坝橡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了精置?” 一聲冷哼從身側響起计寇,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脂倦,沒想到半個月后番宁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡赖阻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年蝶押,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片火欧。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡棋电,死狀恐怖,靈堂內的尸體忽然破棺而出苇侵,到底是詐尸還是另有隱情赶盔,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布榆浓,位于F島的核電站于未,受9級特大地震影響,放射性物質發(fā)生泄漏哀军。R本人自食惡果不足惜沉眶,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杉适。 院中可真熱鬧谎倔,春花似錦、人聲如沸猿推。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至藕咏,卻和暖如春状知,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孽查。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工饥悴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盲再。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓西设,卻偏偏與公主長得像,于是被迫代替她去往敵國和親答朋。 傳聞我的和親對象是個殘疾皇子贷揽,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內容