本文講解的是一種App內頁面跳轉協(xié)議枪向,這里的跳轉包括應用內跳轉谷羞、H5與Native跳轉,服務器通知客戶端如何跳轉等痕貌。
在講解應用內跳轉協(xié)議之前我們先講解一下H5與Native相互跳轉的相關知識點》缯郑現(xiàn)在越來越多的App采用了Native + H5方式開發(fā),其中Native與H5頁面如何交互舵稠?google提供了一個公共的方式:js與native互調超升,即js可以調用Native方法,Native同樣也可以調用js方法哺徊;
但是這種交互方式存在著不少問題:
1室琢、Java 調用 js 里面的函數(shù)、效率并不是很高唉工、估計要200ms左右吧研乒、做交互性很強的事情、這種速度很難讓人接受淋硝、而js去調Java的方法雹熬、速度很快、50ms左右谣膳、所以盡量用js調用Java方法
2竿报、Java 調用 js 的函數(shù)、沒有返回值继谚、調用了就控制不到了
3烈菌、Js 調用 Java 的方法、返回值如果是字符串花履、你會發(fā)現(xiàn)這個字符串是 native 的芽世、轉成 locale 的才能正常使用、使用 toLocaleString() 函數(shù)就可以了诡壁、不過這個函數(shù)的速度并不快济瓢、轉化的字符串如果很多、將會很耗費時間
4妹卿、網(wǎng)頁中盡量不要使用jQuery旺矾、執(zhí)行起來需要5-6秒、最好使用原生的js寫業(yè)務腳本夺克、以提升加載速度箕宙、改善用戶體驗
5、Android4.2以下的系統(tǒng)存在著webview的js對象注入漏洞…(不清楚的可以google)
基于這種種的原因铺纽,我們并未采用這種方式用于Native與webview交互柬帕,而是采用scheme + cookie的方式;
這里的scheme是一種頁面內跳轉協(xié)議狡门,主要用于支持一下幾種場景:
? ? 服務器下發(fā)跳轉路徑陷寝,客戶端根據(jù)服務器下發(fā)跳轉路徑跳轉相應的頁面;
? ? H5頁面點擊錨點融撞,根據(jù)錨點具體跳轉路徑App端跳轉具體的頁面盼铁;
? ? App端收到服務器端下發(fā)的PUSH通知欄消息,根據(jù)消息的點擊跳轉路徑跳轉相關頁面
下面我將簡單介紹一下scheme的基本概念以及以上三種場景下scheme的具體應用尝偎。
URL scheme 概述
URL scheme 的作用
客戶端應用可以向操作系統(tǒng)注冊一個 URL scheme饶火,該 scheme 用于從瀏覽器或其他應用中啟動本應用。通過指定的 URL 字段致扯,可以讓應用在被調起后直接打開某些特定頁面肤寝,比如車輛詳情頁、訂單詳情頁抖僵、消息通知頁鲤看、促銷廣告頁等等。也可以執(zhí)行某些指定動作耍群,如訂單支付等义桂。也可以在應用內通過 html 頁來直接調用顯示 app 內的某個頁面找筝。
URL scheme 的格式
客戶端自定義的 URL 作為從一個應用調用另一個的基礎,遵循 RFC 1808 (Relative Uniform Resource Locators) 標準慷吊。這跟我們常見的網(wǎng)頁內容 URL 格式一樣袖裕。
一個普通的 URL 分為幾個部分,scheme溉瓶、host急鳄、relativePath、query堰酿。
比如:http://www.baidu.com/s?rsv_bp=1&rsv_spt=1&wd=NSurl&inputT=2709疾宏,這個URL中,scheme 為 http触创,host 為 www.baidu.com坎藐,relativePath 為 /s,query 為 rsv_bp=1&rsv_spt=1&wd=NSurl&inputT=2709嗅榕。
一個應用中使用的 URL 例子(該 URL 會調起車輛詳情頁):uumobile://mobile/carDetail?car_id=123456顺饮,其中 scheme 為 uumobile,host 為 mobile凌那,relativePath 為 /carDetail兼雄,query 為 car_id=123456。
Scheme定義Activity
這樣我們便定義了能夠接受scheme請求的activity實例帽蝶,當網(wǎng)頁或者是Android代碼發(fā)送這種規(guī)則scheme的請求的時候就能夠吊起NativeAppActivity了赦肋。
NativeAppActivity這個類中主要用于實現(xiàn)對scheme的解析,然后做出相應的動作励稳,比如請求scheme跳轉登錄頁面佃乘,我們可以這樣定義
uumobile://appname/gotoLogin
我們可以通過Intent對象獲取調用的scheme的host等信息
this.getIntent().getScheme();//獲得Scheme名稱
this.getIntent().getDataString();//獲得Uri全部路徑
3)通過服務器下發(fā)跳轉路徑跳轉相應頁面
startActivity(newIntent(Intent.ACTION_VIEW, Uri.parse("uumobile://yongche/123123123")));
這里的”uumobile://yongche/123123123”就是服務器下發(fā)的跳轉路徑,當我們執(zhí)行startActivity的時候就會調起NativeAppActivity驹尼,然后我們通過在NativeAppActivity解析scheme的內容趣避,跳轉相應的頁面。
4)通過在H5頁面的錨點跳轉相應的頁面
可以發(fā)現(xiàn)我們?yōu)閃ebview設置了WebViewClient新翎,并重寫了WebViewClient的shouldOverrideUrlLoading方法程帕,然后我們解析錨點的url,并根據(jù)解析的內容調起NativeAppActivity的scheme Activity地啰,然后在NativeAppActivity中解析scheme的內容并跳轉相應的頁面愁拭。
5)根據(jù)服務器下發(fā)通知欄消息,App跳轉相應的頁面
服務器下發(fā)的所有的通知都是先跳轉這里的NotificationActivity亏吝,然后在這里執(zhí)行跳轉其他Activity的邏輯岭埠,而這里的H5Constant的buildSchemeFromUrl方法就是構造跳轉頁面Intent對象的,我們可以看一buildSchemeFromUrl方法的具體實現(xiàn):
這樣我們就搞構造除了跳轉NativeAppActivity的Intent對象,并將scheme字符串傳遞給了NativeAppActivity惜论,這樣在NativeAppActivity中就可以解析scheme字符串并執(zhí)行相應的跳轉邏輯了许赃。
總結:
Android中的scheme是一種非常好的實現(xiàn)機制,通過定義自己的scheme協(xié)議来涨,可以非常方便跳轉app中的各個頁面图焰;
通過scheme協(xié)議启盛,服務器可以定制化告訴App跳轉那個頁面蹦掐,可以通過通知欄消息定制化跳轉頁面,可以通過H5頁面跳轉頁面等僵闯。
原文:https://blog.csdn.net/qq_23547831/article/details/51685310