android H5 應(yīng)用內(nèi)跳轉(zhuǎn)Scheme協(xié)議

想必大家在開(kāi)發(fā)項(xiàng)目的過(guò)程中仗处,都會(huì)遇到android與H5界面的交互曲饱。并且還有H5界面 跳轉(zhuǎn)到APP內(nèi)部的功能需要添寺,同志們可能就會(huì)想玷坠,我們要用什么方法來(lái)做蜗搔。那么接下來(lái)我們直接開(kāi)擼,今天要講解的應(yīng)用內(nèi)跳轉(zhuǎn)Scheme協(xié)議

什么是URL Scheme

概述:
android中的scheme是一種頁(yè)面內(nèi)跳轉(zhuǎn)協(xié)議八堡,是一種非常好的實(shí)現(xiàn)機(jī)制樟凄,通過(guò)定義自己的scheme協(xié)議,可以非常方便跳轉(zhuǎn)app中的各個(gè)頁(yè)面兄渺;通過(guò)scheme協(xié)議缝龄,服務(wù)器可以定制化告訴App跳轉(zhuǎn)那個(gè)頁(yè)面,可以通過(guò)通知欄消息定制化跳轉(zhuǎn)頁(yè)面挂谍,可以通過(guò)H5頁(yè)面跳轉(zhuǎn)頁(yè)面等叔壤。

URL Scheme應(yīng)用場(chǎng)景

概述:
客戶端應(yīng)用可以向操作系統(tǒng)注冊(cè)一個(gè)URL Scheme,該scheme用于從瀏覽器或其他應(yīng)用中啟動(dòng)本應(yīng)用口叙,通過(guò)scheme協(xié)議來(lái)跳轉(zhuǎn)到相應(yīng)的APP界面炼绘,比如商品詳情,活動(dòng)詳情妄田,商家詳情等等界面俺亮。也可以執(zhí)行某些指定動(dòng)作,如完成支付等疟呐。也可以在應(yīng)用內(nèi)部通過(guò)H5頁(yè)面來(lái)直接跳轉(zhuǎn)APP某個(gè)界面脚曾。

  • URL Scheme應(yīng)用場(chǎng)景分為以下4中:

    • 服務(wù)器下發(fā)跳轉(zhuǎn)路徑,客戶端根據(jù) 服務(wù)器下發(fā)跳轉(zhuǎn)路徑跳轉(zhuǎn)相應(yīng)的頁(yè)面
    • H5頁(yè)面點(diǎn)擊描點(diǎn)启具,根據(jù)描點(diǎn)具體跳轉(zhuǎn)路徑APP端跳轉(zhuǎn)具體的頁(yè)面
    • APP端收到服務(wù)器端下發(fā)的PUSH通知欄消息本讥,根據(jù)消息的點(diǎn)擊跳轉(zhuǎn)路徑跳轉(zhuǎn)相關(guān)頁(yè)面
    • APP根據(jù)URL跳轉(zhuǎn)到另外一個(gè)APP指定頁(yè)面

URL Scheme協(xié)議格式:

URL Scheme 屬性分為,Scheme,Host,port,path,query,

test://shangjia/shangjiaDetail?shagnjiaId=222

通過(guò)上面的路徑我們來(lái)分析鲁冯,

  • scheme : test
  • host : shangjia
  • path : shangjiaDetail
  • query : shangjiaId=222

我們可以用代碼來(lái)驗(yàn)證:
驗(yàn)證的地址是這個(gè):test://start/?id=431&name=zhouyuan&age=23

Intent intent = getIntent();
    String action = intent.getAction();
    String scheme = intent.getScheme();
    Uri uri = intent.getData();
    System.out.println("action:" + action);
    System.out.println("scheme:" + scheme);
    if (uri != null) {
        String host = uri.getHost();
        String dataString = intent.getDataString();
        String id = uri.getQueryParameter("id");
        String name = String.valueOf(uri.getQueryParameters("name"));
        String age = uri.getQueryParameter("age");
        String path = uri.getPath();
        String path1 = uri.getEncodedPath();
        String queryString = uri.getQuery();
        System.out.println("host:" + host);
        System.out.println("dataString:" + dataString);
        System.out.println("id:" + id);
        System.out.println("name:" + name);
        System.out.println("age:" + age);
        System.out.println("path:" + path);
        System.out.println("path1:" + path1);
        System.out.println("queryString:" + queryString);
    }

看圖

[圖片上傳失敗...(image-bd4821-1557361721983)]

從這個(gè)例子我們能看出:我們是想跳入商家詳情界面拷沸。主要的這些參數(shù),都是需要自己去和前端去達(dá)成一個(gè)協(xié)議薯演。并不是說(shuō)非要按照我的這個(gè)例子來(lái)撞芍。比如你的項(xiàng)目是做汽車的,可以把URL寫(xiě)成

test://qiche/qicheDetail?qicheId=222

這些都沒(méi)什么影響涣仿。

在AndroidMainfest.xml 配置 scheme

<application
    android:name=".MyApplication"
    android:allowBackup="true"
    android:icon="@drawable/logo"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".activity.StartActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <intent-filter>
            //這三方必須配置
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />

            <data
                android:host="web"
                android:scheme="test" />
            <data
                android:host="start"
                android:scheme="test" />
        </intent-filter>

    </activity> 
<activity android:name=".activity.LoginActivity">
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data
                android:host="login"
                android:scheme="test" />
        </intent-filter>
    </activity>

當(dāng)網(wǎng)頁(yè)或者通知欄勤庐,Android代碼發(fā)送這種規(guī)則scheme時(shí)這時(shí)候就會(huì)調(diào)起相對(duì)應(yīng)界面。

那么接下來(lái)我們就該測(cè)試一波:

  1. 通過(guò)服務(wù)器下發(fā)跳轉(zhuǎn)路徑跳轉(zhuǎn)相應(yīng)頁(yè)面
    button.setOnClickListener(v -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("test://login/123123123"))));

看下圖:

[圖片上傳失敗...(image-5effd2-1557361721982)]

這個(gè)前提好港,你需要在AndroidMainfest.xml配置愉镰,你看上面的代碼。


2.通過(guò)H5頁(yè)面的錨點(diǎn)跳轉(zhuǎn)相應(yīng)的頁(yè)面

html代碼:

 <html>
<head>
<title>Js調(diào)用Android</title>

</head>

<body>
<a href="test://start/?id=431&name=zhouyuan&age=23">跳轉(zhuǎn)start</a>
<a href="test://web/?id=431&name=zhouyuan&age=23">跳轉(zhuǎn)web</a>
<a href="test://login/?id=431&name=zhouyuan&age=23">跳轉(zhuǎn)Login</a>
</body>
</html>

//webview代碼
webview.setWebViewClient(new WebViewClient() {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            System.out.println("view = [" + view + "], url = [" + url + "]");
            return true;
        }
    });

[圖片上傳失敗...(image-d71a9d-1557361721982)]

  • 這個(gè)具體的我就不再講了钧汹,我們已經(jīng)獲取到了URL Scheme協(xié)議地址丈探。我們可以直接用一些正則來(lái)取到相應(yīng)的字符串,然后根據(jù)該字符串來(lái)判斷拔莱,跳到相應(yīng)的界面碗降。

  • 如果你覺(jué)得改方法比較麻煩。那可以直接在AndroidMainfest.xml配置相應(yīng)的屬性塘秦,前提是URL協(xié)議地址要相應(yīng)讼渊。不然你是跳轉(zhuǎn)不了的。

具體的可以自行測(cè)試尊剔,就是把 webview.setWebViewClient(new WebViewClient()){}給注釋掉爪幻。
我們點(diǎn)擊跳轉(zhuǎn)Login時(shí),會(huì)有意想不到的效果须误。具體還是不建議這么做挨稿,自己想一想,前面也講到在項(xiàng)目中可能URL Scheme協(xié)議并不止一個(gè)界面京痢。如果你在AndroidMainfest.xml里面去給每一個(gè)可能相關(guān)的界面都配置scheme屬性奶甘,那你整個(gè)界面看著也不美觀,而且還都是重復(fù)的配置祭椰。所以還是建議根據(jù)URL地址來(lái)判斷跳轉(zhuǎn)臭家。


3.根據(jù)服務(wù)器下發(fā)通知欄消息,APP跳轉(zhuǎn)相應(yīng)的界面

其實(shí)吭产,我們簡(jiǎn)單的想一下侣监,都是同樣的邏輯。把服務(wù)器下發(fā)的通知欄消息臣淤,里面的URL地址數(shù)據(jù)拿到橄霉,進(jìn)行解析判斷,然后跳轉(zhuǎn)到相應(yīng)的界面邑蒋。具體代碼就不貼了姓蜂。

總結(jié):
Android中的URL Scheme是一個(gè)非常好的機(jī)制,我們可以通過(guò)自定義Scheme屬性医吊,讓我們方便钱慢,靈活的在APP內(nèi)隨意跳轉(zhuǎn)。如果不明白請(qǐng)留言卿堂。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末束莫,一起剝皮案震驚了整個(gè)濱河市懒棉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌览绿,老刑警劉巖策严,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異饿敲,居然都是意外死亡妻导,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門怀各,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)倔韭,“玉大人,你說(shuō)我怎么就攤上這事瓢对∈僮茫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵硕蛹,是天一觀的道長(zhǎng)份名。 經(jīng)常有香客問(wèn)我,道長(zhǎng)妓美,這世上最難降的妖魔是什么僵腺? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮壶栋,結(jié)果婚禮上辰如,老公的妹妹穿的比我還像新娘。我一直安慰自己贵试,他們只是感情好琉兜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著毙玻,像睡著了一般豌蟋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桑滩,一...
    開(kāi)封第一講書(shū)人閱讀 51,604評(píng)論 1 305
  • 那天梧疲,我揣著相機(jī)與錄音,去河邊找鬼运准。 笑死幌氮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胁澳。 我是一名探鬼主播该互,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼韭畸!你這毒婦竟也來(lái)了宇智?” 一聲冷哼從身側(cè)響起蔓搞,我...
    開(kāi)封第一講書(shū)人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎随橘,沒(méi)想到半個(gè)月后败明,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡太防,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酸员。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜒车。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖幔嗦,靈堂內(nèi)的尸體忽然破棺而出酿愧,到底是詐尸還是另有隱情,我是刑警寧澤邀泉,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布嬉挡,位于F島的核電站,受9級(jí)特大地震影響汇恤,放射性物質(zhì)發(fā)生泄漏庞钢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一因谎、第九天 我趴在偏房一處隱蔽的房頂上張望基括。 院中可真熱鬧,春花似錦财岔、人聲如沸风皿。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)桐款。三九已至,卻和暖如春夷恍,著一層夾襖步出監(jiān)牢的瞬間魔眨,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工酿雪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冰沙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓执虹,卻偏偏與公主長(zhǎng)得像拓挥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子袋励,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

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