前言
最近項目涉及DeepLink,雖然平時有遇到過,但是並不知道這個術語,特意瞭解了下,還是比較少關注官方動態。。。
文章內容大部分來自DeepLink的實現原理,說得很不錯。
什麼是DeepLink
DeepLink:創建指向應用內容的深層鏈接,主要應用場景是通過Web頁面直接調用Android原生app,並且把需要的參數通過Uri的形式,直接傳遞給app。
例如:好友在微信中推薦某個京東產品,然後會有是否打開京東app的提示,當我們點擊 ‘是’ 的時候就會自動跳轉到京東app相關頁面。
原理
實際上是Android的隱式啓動,通過配置intent-filter中的data屬性來匹配
data的主要屬性:
- scheme:協議類型,我們可以自定義,一般是項目或公司縮寫,String
- host:域名地址,String
- port:端口,int。
- path:訪問的路徑,String
- pathPrefix:訪問的路徑的前綴,String
- pathPattern:訪問路徑的匹配格式,相對於path和pathPrefix更爲靈活,String
- mimeType:資源類型,例如常見的:video/*, image/png, text/plain。\
注意事項:
- scheme和host不可缺省,否則配置無效;
- path,pathPrefix,pathPattern一般指定一個就可以了,pathPattern與host不可同時使用;
- mimeType可以不設置,如果設置了,跳轉的時候必須加上mimeType,否則不能匹配到Activity。
data屬性實際上是爲當前的頁面綁定了一個Uri地址,這樣就可以通過Uri直接打開這個Activity。
Uri的結構:
<scheme> :// <host> : <port> / [ <path> | <pathPrefix> | <pathPattern> ]
示例:https://zhidao.baidu.com/question/2012197558423339788.html
使用
1.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="host"
android:path="/path"
android:scheme="xxx" />
</intent-filter>
上述部分除了data部分可根據實際自定義格式外,其他的action、兩個category必須要。
2.如何傳遞參數?
在path後添加?及相關參數和值
xxx://host/path?id=111
app接收:
if (intent != null && intent.data != null) {
Log.e("lzp", intent.data.getQueryParameter("id"))
}
3.如何打開這些頁面?
private void gotoDeepLink(Context context, String url) {
try {
Intent skipIntent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
skipIntent.addCategory("android.intent.category.BROWSABLE");
skipIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(skipIntent);
} catch (Exception e) {
e.printStackTrace();
}
}
更多細節可查閱
1.DeepLink的實現原理
2.DeepLink用法及原理解析
3.創建指向應用內容的深層鏈接