分屏源碼解析(1):分屏模式下主要的數(shù)據(jù)結(jié)構(gòu)

分屏模式就是可以在recent中選取一個任務(wù)锄弱,然后調(diào)用startActivityFromRecent()向AMS請求在一個新的DOCKED stack中打開該任務(wù)對應(yīng)的activity摆屯,再讓recent app的畫面重新啟動柳弄,兩個activity在屏幕的兩側(cè)玖媚,從而實現(xiàn)了分屏功能件已,因此AMS是如何創(chuàng)建DOCKED stack和WMS如何知道這兩個activity的布局區(qū)域等問題就是該模式實現(xiàn)的關(guān)鍵了桩蓉,所以要把這其中的數(shù)據(jù)結(jié)構(gòu)搞清楚增拥,才能去看流程怎么回事破婆。下面依次介紹:

ActivityManagerService(AMS)中相關(guān)的類介紹:

? (1)Activity:這個就不用過多介紹了涮总。

? (2)ActivityRecord:保存了關(guān)于特定Activity的信息,是AMS里的對于客戶端Activity的一個映射祷舀,從該類中可以獲取到客戶端關(guān)于這個Activity的所有信息瀑梗。

? (3)TaskRecord:一個TaskRcord對應(yīng)了多個ActivityRecord,也就是說一個Task是包含了多個Activity的裳扯,用List保存:

/** List of all activities in the task arranged in history order */

final ArrayList<ActivityRecord> mActivities;

(4)ActivityStack:一個ActivityStack對應(yīng)了多個TaskRecord抛丽,也是用List保存:

/**

* The back history of all previous (and possibly still

* running) activities.? It contains #TaskRecord objects.

*/

private final ArrayList<TaskRecord> mTaskHistory = new ArrayList<>();

ps:這里就能看出來,activity的四種啟動模式:standard嚎朽,single_top铺纽,single_instance,single_task哟忍,是怎么被管理的了(不了解四種啟動模式的話略過這段內(nèi)容狡门,有興趣也可查閱其他資料)。比如standard模式锅很,會無限制創(chuàng)建ActivityRecord其馏,哪怕它已經(jīng)有相同的實例了,因為它在對應(yīng)的TaskRcord中會一直add你要啟動的activity對應(yīng)的ActivityRecord爆安,所以按回退鍵的時候叛复,Activity挨個出棧能看到所有啟動過的Activity,而如果是single_task的話扔仓,啟動的時候會先檢查ActivityStack的mTaskHistory里是否已經(jīng)有了這個TaskRecord褐奥,如果有就不會重新創(chuàng)建了,而是通過先remove掉管理它的Stack中List里面的TaskRecord翘簇,再add到List的尾部撬码,從而實現(xiàn)了這個TaskRecord處于Stack的頂部,至于single_instance版保,那么就是一個TaskRecord對應(yīng)了這個Activity的ActivityRecord呜笑,不會有其他的ActivityRecord被添加到這個TaskRecord中夫否,即一對一的關(guān)系。

? ? (5)ActivityContainer:一個ActivityContainer對應(yīng)了一個ActivityStack叫胁,該類提供了接口可以控制對應(yīng)的ActivityStack凰慈。

? ? ? (6)ActivityDisplay:一個ActivityDisplay對應(yīng)了多個ActivityStack,同樣用List管理驼鹅。

/** All of the stacks on this display. Order matters, topmost stack is in front of all other

* stacks, bottommost behind. Accessed directly by ActivityManager package classes */

final ArrayList<ActivityStack> mStacks = new ArrayList<>();



(7)ActivityStackSupervisor:該類聽名字就知道是用于管理ActivityStack的微谓。

WindowManagerService中的相關(guān)類:

? (1)Task:WMS中對應(yīng)TaskRecord的類。

? (2)TaskStack:WMS中對應(yīng)ActivityStack的類谤民,用于管理Task堰酿,也就是說它的child是Task。

? (3)TaskWindowController:創(chuàng)建TaskRecord的時候张足,也會創(chuàng)建這個類的對象触创,用于管理Task。

? (4)StackWindowController:創(chuàng)建ActivityStack的時候为牍,也會創(chuàng)建這個類的對象哼绑,用于TaskStack。

? (5)DisplayContent:管理所有TaskStack碉咆,也就是說它的child是TaskStack抖韩。

? (6)RootWindowContainer:所有window的根節(jié)點,從這里可以遍歷到所有的window疫铜,它的child是DisplayContent茂浮。

? (7)WindowContainer:一個容器類的父類,TaskStack壳咕,DisplayContent席揽,RootWindowContaniner均繼承了它,它里面實現(xiàn)了一套管理child的方法谓厘,也就是提供了父節(jié)點管理子節(jié)點的方法幌羞。

? (8)WindowContainerController:控制容器類的父類,TaskWindowContainer竟稳,StackWindowController属桦,AppWindowContainerController繼承于它,同樣也是提供了父節(jié)點管理子節(jié)點的方法他爸。

? ? (9)AppWindowToken:一個應(yīng)用(或者說一個Acitivty的畫面)的一組Window聂宾。

? ? (10)AppWindowContainerController:管理AppWindowToken所有。

? ? (11)WindowState:WMS中window的概念诊笤,代表了一個window系谐。

? ? 如圖:



從這里我們能看出來很重要的一點:AMS的Activity數(shù)據(jù)結(jié)構(gòu),在WMS中有類似的映射盏混,其實AMS也有類似WindowContainer的容器結(jié)構(gòu)蔚鸥,叫做ConfigurationContainer,ActivityStackSupervisor许赃,ActivityStack止喷,TaskRecord,ActivityRecord也均繼承于它混聊。

? ? 在AMS的數(shù)據(jù)結(jié)構(gòu)創(chuàng)建的時候弹谁,WMS也有映射的數(shù)據(jù)結(jié)構(gòu)創(chuàng)建,比如我們創(chuàng)建DOCKED stack的時候句喜,就會創(chuàng)建相應(yīng)的StackWindowController预愤,然后創(chuàng)建相應(yīng)的TaskStack,然后添加到DisplayContent中(因為父節(jié)點是它)咳胃。


總結(jié):AMS和WMS的交互是分屏模式的重點植康,要弄清楚內(nèi)部發(fā)生了什么才能去實現(xiàn)新功能,上面的數(shù)據(jù)結(jié)構(gòu)都是較為重要的展懈,還有一些沒有列舉以后可以補充销睁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市存崖,隨后出現(xiàn)的幾起案子冻记,更是在濱河造成了極大的恐慌,老刑警劉巖来惧,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冗栗,死亡現(xiàn)場離奇詭異,居然都是意外死亡供搀,警方通過查閱死者的電腦和手機隅居,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趁曼,“玉大人军浆,你說我怎么就攤上這事〉踩颍” “怎么了乒融?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長摄悯。 經(jīng)常有香客問我赞季,道長,這世上最難降的妖魔是什么奢驯? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任申钩,我火速辦了婚禮,結(jié)果婚禮上瘪阁,老公的妹妹穿的比我還像新娘撒遣。我一直安慰自己邮偎,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布义黎。 她就那樣靜靜地躺著禾进,像睡著了一般。 火紅的嫁衣襯著肌膚如雪廉涕。 梳的紋絲不亂的頭發(fā)上泻云,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音狐蜕,去河邊找鬼宠纯。 笑死,一個胖子當(dāng)著我的面吹牛层释,可吹牛的內(nèi)容都是我干的婆瓜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼贡羔,長吁一口氣:“原來是場噩夢啊……” “哼勃救!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起治力,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蒙秒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宵统,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晕讲,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年马澈,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓢省。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡痊班,死狀恐怖勤婚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涤伐,我是刑警寧澤馒胆,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站凝果,受9級特大地震影響祝迂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜器净,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一型雳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦纠俭、人聲如沸沿量。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽欧瘪。三九已至,卻和暖如春匙赞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背妖碉。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工涌庭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人欧宜。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓坐榆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親冗茸。 傳聞我的和親對象是個殘疾皇子席镀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355

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