一、概念
1. 介紹
- DeepLink與AppLink毒涧,本質(zhì)上都是基于Intent框架魂拦,使App能夠識(shí)別并處理來自系統(tǒng)或其他App的某種特殊URL,在原生App之間相互跳轉(zhuǎn)做瞪,實(shí)現(xiàn)良好的用戶體驗(yàn)
- DeepLink相對(duì)簡單对粪,有時(shí)不能直接喚起目標(biāo)App,會(huì)出現(xiàn)多選項(xiàng)彈窗装蓬、確認(rèn)彈窗等著拭,需要用戶進(jìn)一步操作;AppLink相對(duì)復(fù)雜牍帚,需要App與Web協(xié)作完成系統(tǒng)驗(yàn)證儡遮,但可以保證直接喚起目標(biāo)App,無需用戶二次選擇或確認(rèn)
2. 區(qū)別
不同點(diǎn) | DeepLink | AppLink |
---|---|---|
Intent scheme | 任意 | 要求http或https |
Intent action | 任意 | 要求配置andorid.intent.action.VIEW |
Intent category | 任意 | 要求配置android.intent.category.BROWSABLE和android.intent.category.DEFAULT |
鏈接認(rèn)證 | 無需驗(yàn)證 | 要求進(jìn)行Digital Asset Links文件驗(yàn)證 |
用戶體驗(yàn) | 可能展示一個(gè)多選項(xiàng)彈窗或確認(rèn)彈窗暗赶,用戶需要二次選擇或確認(rèn) | 無彈窗鄙币,直接由App處理鏈接 |
兼容性 | 所有版本 | Android6.0及以上版本 |
二、DeepLink實(shí)踐
1. 被喚起方
1.1 首先蹂随,需要在AndroidManifest.xml文件進(jìn)行配置
<activity
android:name=".activities.CalledActvity"
android:screenOrientation="portrait">
<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="www.example.com"
android:scheme="http" />
<data
android:host="www.example.com"
android:scheme="https" />
<data
android:host="www.example.com"
android:path="/user/profile"
android:scheme="https" />
<data
android:host="www.example.com"
android:pathPrefix="/user"
android:scheme="https" />
</intent-filter>
</activity>
配置項(xiàng)作用:
- ACTION_VIEW:支持被檢索
- CATEGORY_DEFAULT:響應(yīng)隱式Intent
- CATEGORY_BROWSABLE:可被Web瀏覽器喚起
- data:一個(gè)或多個(gè)爱榔,必須含有scheme標(biāo)簽,決定被喚起的URL格式糙及。
其中:
- App可以配置多個(gè)支持喚起的Activity
- Activity可以支持被多個(gè)URL喚起
- 若一個(gè)App配置了多個(gè)支持喚起的Activity详幽,它們的scheme和host一般一致,然后通過path、pathPrefix等進(jìn)行定向區(qū)分
1.2 然后唇聘,被喚起后解析URL數(shù)據(jù)
@Override
public void onCreate(Bundle savesInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent intent=getIntent();
String action=intent.getAction();
Uri data=intent.getData();
//解析data
String scheme=data.getScheme();
String host=data.getHost();
String path=data.getPath();
int port=data.getPort();
Set<String> paramKeySet=data.getQueryParameterNames();
...
}
- URL基本格式
scheme://host/path?param1=value1¶m2=value2
eg: example://www.example.com/user?uid=123&name=Ming
2. 喚起方
2.1 獲取到被喚起方的URL后版姑,使用Intent跳轉(zhuǎn)
Intent intent=new Intent();
intent.setData(Uri.parse("example://www.example.com/user?uid=123&name=Ming"));
startActivity(intent);
- 需要回調(diào)數(shù)據(jù)時(shí),使用startActivityForResult
三迟郎、AppLink實(shí)踐
鏈接
四剥险、配置示例
1. DeepLink
騰訊視頻Android客戶端,反編譯獲取AndroidManifest文件
<activity android:configChanges="keyboardHidden|orientation|screenSize" android:launchMode="singleTask" android:name="com.tencent.qqlive.open.QQLiveOpenActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.Translucent.NoTitleBar">
<intent-filter>
<action android:name="android.intent.action.qqlive.open.details"/>
<action android:name="android.intent.action.qqlive.open.player"/>
<action android:name="android.intent.action.qqlive.open.list"/>
<action android:name="android.intent.action.qqlive.open.live"/>
<action android:name="android.intent.action.qqlive.open.home"/>
<category android:name="android.intent.category.DEFAULT"/>
</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:scheme="qqlive"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="tenvideo2"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="txvideo"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="videopush"/>
</intent-filter>
<intent-filter>
<action android:name="com.tencent.qqlive.action.oppo.push"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
2. AppLink
淘寶Android客戶端宪肖,反編譯獲取AndroidManifest文件
<activity android:name="com.taobao.android.tbplay.GameDetailActivity">
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW"/>
<action android:name="android.intent.action.NAV.ACTION"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="http"/>
<data android:scheme="https"/>
<data android:host="m.taobao.com" android:pathPattern="/tbplay.htm"/>
</intent-filter>
<meta-data android:name="bundleLocation" android:value="com.taobao.android.tbplay"/>
</activity>