<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
大家如果經歷過Hybrid專案的開發,即專案中涉及到H5與Native之間的互動,那麼很有可能會遇到各種各樣的H5容器。為什麼會有那麼多各種各樣的容器呢...這也是輪子多的通病了,輪子多到業務方不知道選哪個。當然,也有可能大家壓根就不會使用到H5容器,直接用系統WebView就完事兒了,比如我的前東家就是這樣做的。那這篇文章的主題就是與前者相關的:當專案中擁有很多個H5容器時,怎樣封裝才能讓業務側用得爽呢?
下面按慣例,丟擲這篇文章要解決的三個問題:
術語 | 描述 |
---|---|
H5框架容器 | 特指目前專案中正在使用的二方/三方H5容器。 |
H5通用容器 | 特指將專案中所有的框架容器抽象到一個容器中,讓業務側不需要感知到具體的框架細節。 |
A頁面 | url query引數中帶a=true的頁面,專案中用A容器承載。 |
B頁面 | url query引數中帶b=true的頁面,專案中用B容器承載。 |
業務側呼叫的介面其實很有限,可以說90%的業務都只是開啟一個網頁而已。
我們根據業務需要新建一個介面類:
/** * WebPage服務介面類 */ public interface IWebPageService { /** * 開啟url * @param url */ void openUrl(String url); /** * 建立Fragment內建到某頁面中使用 * @return */ Fragment buildFragment(String url, Context context); /** * 獲取當前Url * @return */ String getCurrentUrl(); /** * 給h5發通知 * @param eventData * @param eventName */ void postNotificationToJS(String eventName, String eventData); }
以上列舉了4個非常常見的介面。如果有需要,還可以擴充套件其它的,比如設定容器生命週期相關的監聽、設定H5發通知來時的監聽等等。拿openUrl
的實現舉例,實現類通過url中的引數判斷需要開啟A容器
還是B容器
。
@Override public void openUrl(String url) { // 若url中含有A引數,則用A容器開啟 // if (urlParamHasA) { // startAContainer(); // } else { // 否則用B容器開啟 // startBContainer(); //} }
這就從介面層這一層面遮蔽了內部框架容器。其它介面也是類似,原則就是不讓業務側感知到具體的實現細節,而不是跳個頁面還需要知道這個url是要用A容器開啟還是B容器開啟。在應用啟動時,可以將實現類注入到公共依賴中去,也可以通過ARouter等框架實現依賴注入,方便業務側的呼叫。
先上一張圖:
介面層上面已經講過了,這裡我們直接看容器層。
第一層就是我們抽出來的通用容器,WebPageActivity與WebPageFragement。專案中,不管是哪個H5框架容器,勢必都是用Activity或者Fragment來承載的,所以我們相應的也需要有這兩者作為父類別去進行封裝。而通用容器中,最重要的職責就是去執行通用邏輯,即每個框架容器都需要執行的邏輯。
通用職責可以有以下幾點:
onActivityResult
、onRequestPermissionResult
這類事件,然後將結果分發給各listener。拿WebPageActivity#onCreate
舉例:
@Override protected void onCreate(Bundle savedInstanceState) { // setWindowFlags(); 設定window屬性 // setTheme(); 設定主題 // setTransition(); 設定轉場動畫 super.onCreate(savedInstanceState); // parseUrl(); 解析url // initCommonUI(); 渲染通用UI 比如TitleBar、底部導航欄等 setContentView(); loadUrl(); } protected abstract void setContentView(); protected abstract void loadUrl();
我們可以將設定window屬性、設定主題這些通用行為放在通用容器中執行,而setContentView
與loadUrl
交由框架容器去執行。setContentView
是因為不同的容器,layout xml可能是不一樣的。loadUrl
是因為每個容器用WebView去載入url的方式也可能不同,無法統一。類似的行為,若執行時機可統一,則由通用容器統一執行時機,比如setContentView
與loadUrl
。若時機也沒法確定,甚至邏輯只會存在於某個框架容器中,那麼就要寫到子類中去了。
圖中第二層的容器A、容器B、容器C指的就是框架容器。有了通用容器承載共同的邏輯後,框架容器需要做的事情就比較少了。只需要載入各自的佈局,初始化WebView,然後將url載入到WebView中就可以了(除非有某個框架容器需要特殊適配,那就得寫些額外的程式碼)。具體的實現需要根據專案中框架容器的使用方式來確定。
第三層表示基礎元件。這裡只列一些常見的基礎元件。
shouldOverrideUrlLoading
重定向時對url進行攔截,以及根據相應的生命週期回撥(onPageStarted、onPageFinished、onReceviedError
等)進行loading或異常態UI的渲染時。若每個框架容器可以設定同一個WebViewClient,那就非常方便了,只要改一處地方,所有容器就都生效了。當然,除此之外,根據每個專案的完整度與負責度,還會衍生出很多基礎元件。比如H5的監控體系,H5的預載入體系,以及WebView預建立相關的快取體系等。他們作為框架容器共同的底座承擔相應的職責。
到此這篇關於Android H5通用容器架構設計詳解的文章就介紹到這了,更多相關Android H5容器架構內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45