什么是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協(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);
}
看圖
從這個(gè)例子我們能看出:我們是想跳入商家詳情界面。主要的這些參數(shù),都是需要自己去和前端去達(dá)成一個(gè)協(xié)議。并不是說(shuō)非要按照我的這個(gè)例子來(lái)。比如你的項(xiàng)目是做汽車的,可以把URL寫成
test://qiche/qicheDetail?qicheId=222
這些都沒什么影響。
在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è)試一波:
- 通過(guò)服務(wù)器下發(fā)跳轉(zhuǎn)路徑跳轉(zhuǎn)相應(yīng)頁(yè)面
button.setOnClickListener(v -> startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("test://login/123123123"))));
看下圖:
這個(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;
}
});
這個(gè)具體的我就不再講了,我們已經(jīng)獲取到了URL Scheme協(xié)議地址。我們可以直接用一些正則來(lái)取到相應(yīng)的字符串,然后根據(jù)該字符串來(lái)判斷,跳到相應(yīng)的界面。
如果你覺得改方法比較麻煩。那可以直接在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)留言。