1、协议结构
<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
scheme | 协议名,如http |
---|---|
host | 主机名,如localhost |
port | 端口名,如8080 |
path | 路径名,用来匹配完整的路径 |
pathPrefix | 用来匹配路径的开头部分 |
pathPattern | 用表达式来匹配整个路径 |
注:path、 pathPrefix、 pathPattern 之间的区别
pathPattern匹配规则
* | 用来匹配0次或更多,如“a*” 可以匹配“a”、“aa”、“aaa”… |
---|---|
. | 用来匹配任意字符,如:“.” 可以匹配“a”、“b”,“c”… |
.* | 用来匹配任意字符0次或更多,如:“.*html” 可以匹配 “abchtml”、“chtml”,“html”,“sdf.html”… |
2、协议匹配示例
url
testscheme://testhost:8000/testpath/test.html
AndroidManifest.xml
android:scheme="testscheme"
android:host="testhost"
android:port="8000"
android:path="/testpath/test.html"
android:pathPrefix="/testpath"
android:pathPattern=".*html"
<activity android:name=".deeplink.DeepLinkActivity">
<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:scheme="testscheme"
android:host="testhost"
android:port="8000"
android:path="/testpath/test.html"
android:pathPrefix="/testpath"
android:pathPattern=".*html"
/>
</intent-filter>
</activity>
3、代码示例
test.html
<style>a {font-size: 38px}</style>
<a href="testscheme://testhost:8000/testpath/param?name=zlz&sex=man"> deep link test</a><br>
AndroidManifest.xml
<activity android:name=".deeplink.DeepLinkActivity">
<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:scheme="testscheme"
android:host="testhost"
android:port="8000"
android:pathPrefix="/testpath"
/>
</intent-filter>
</activity>
DeepLinkActivity
/**
* 获取url中的参数(键值对形式)
*
* @param url
* @return
*/
private HashMap<String, String> getUrlParams(String url) {
if (url.contains("?") && url.contains("&") && url.contains("=")) {
int index = url.indexOf("?");
String params = url.substring(index + 1);
String[] argAry = params.split("&");
HashMap<String, String> resultMap = new HashMap<String, String>();
for (String arg : argAry) {
String[] keyValue = arg.split("=");
resultMap.put(keyValue[0], keyValue[1]);
}
return resultMap;
}
return null;
}
/**
* 获取 deep link 中的参数
*/
private void getDeepLinkData() {
Uri uri = getIntent().getData();
String url = uri.toString();
if (!TextUtils.isEmpty(url)) {
String name = getUrlParams(url).get("name");
String sex = getUrlParams(url).get("sex");
textView.setText("name : " + name + "\n" + "sex : " + sex);
}
}