背景
Google每一次大版本升級(jí)都會(huì)在架構(gòu)上改動(dòng)通話,本文主要從設(shè)計(jì)模式方面介紹Android O到Android P通話界面InCallUI的改變。
Android O的MVP架構(gòu)
先看圖其掂,
Android P之前的通話界面主要有兩層MVP結(jié)構(gòu),分別為:
外層:CallList(M)-InCallActivity(V)-InCallPresent(P)
內(nèi)層:Call(M)-XXXFragment(V)-XXXPresent(P)
外層MVP
如圖:
Fragment和ViewInterface的關(guān)系
上面圖中每一個(gè)Fragment都有其對(duì)應(yīng)的Ui,如圖:
其中每個(gè)Fragment實(shí)現(xiàn)一個(gè)Ui操作接口碍彭,而一個(gè)Ui操作接口只表示界面的一部分。如VideoUi就只包含視頻相關(guān)view操作证舟、CallCardUi就只包含聯(lián)系人信息的相關(guān)view操作硕旗、CallButtonUi只包含操作按鈕的相關(guān)view操作。所以當(dāng)顯示一個(gè)視頻來電時(shí)女责,需要同時(shí)顯示VideoCallUi漆枚、CallCardUi、CallButtonUi抵知,因此視頻來電界面的InCallActivity里面同時(shí)顯示了VideoCallFragment墙基、CallCardFragment、CallButtonFragment三個(gè)Fragment刷喜。
內(nèi)層MVP
用Call-CallButtonFragment-CallButtonPresenter舉例如下:
Android P的新MVP架構(gòu)
先看圖:
外層MVP
外層變化不大残制,如圖:
主要是Activity里面對(duì)應(yīng)的Fragment的包含關(guān)系的變化。(Android O之后去掉了CallButtonFragment掖疮。)
Fragment和ViewInterface的關(guān)系
如圖:
其中Activity包含的三個(gè)主Fragment每個(gè)Fragment都對(duì)應(yīng)包含一個(gè)完整的界面初茶,比如VideoCallFragment里面有:包含了視頻相關(guān)view操作的VideoCallScreen、包含了聯(lián)系人相關(guān)信息操作的InCallScreen浊闪、包含了操作按鈕相關(guān)操作的InCallButtonUi恼布。即每個(gè)Fragment實(shí)現(xiàn)多個(gè)view操作接口。
如下圖所示:
內(nèi)層MVP
因?yàn)镕ragment和ViewInterface的關(guān)系變化搁宾,所以導(dǎo)致內(nèi)層MVP結(jié)構(gòu)也發(fā)生變化折汞,如圖:
其中的View由之前的一個(gè)僅實(shí)現(xiàn)該view操作的Fragment變成多個(gè)。
加入Delegate模式
MVP中View通知Presenter user events的過程中g(shù)oogle加了一層deleate模式的封裝盖腿,如下:
InCallButtonUi的實(shí)現(xiàn)者們不會(huì)直接通知CallButtonPresenter有用戶操作爽待,而是委派InCallButtonUiDelegate去處理。比如翩腐,撥號(hào)但未真撥號(hào)成功時(shí)顯示的偽通話界面鸟款,如過用戶點(diǎn)擊了該界面的按鈕就不需要CallButtonPresenter去處理。
加入Factory模式
如圖:
新架構(gòu)的優(yōu)點(diǎn)
1. ViewInterface和Fragment的關(guān)系更改后使得內(nèi)層MVP架構(gòu)更容易擴(kuò)展茂卦。
2. 加入Delegate和Factory模式使得外層MVP更容易擴(kuò)展何什。如CallPendingActivity,其界面和InCallActivity界面幾乎一致疙筹,但它不需與Call交互富俄,與用戶交互的操作也與InCallActivity不同禁炒,用新的架構(gòu)就很容易實(shí)現(xiàn)。同時(shí)霍比,視頻彩鈴也可以更容易擴(kuò)展:增加一個(gè)CRBTFragment幕袱,定制自己的界面,實(shí)現(xiàn)VideoCallScreen悠瞬、InCallScreen们豌、InCallButtonUi就行。
原創(chuàng)內(nèi)容歡迎轉(zhuǎn)載浅妆,但請(qǐng)注明出處望迎,謝謝!