編寫:Lin-H - 原文:http://developer.android.com/training/app-indexing/deep-linking.html
為使Google能夠抓取你的app內(nèi)容,并允許用戶從搜索結(jié)果進(jìn)入你的app,你必須給你的app manifest中相關(guān)的activity添加intent filter。這些intent filter能使深度鏈接與你的任何activity相連。例如,用戶可以在購(gòu)物app中,點(diǎn)擊一條深度鏈接來(lái)瀏覽一個(gè)介紹了自己所搜索的產(chǎn)品的頁(yè)面。
要?jiǎng)?chuàng)建一條與你的app內(nèi)容相連的深度鏈接,添加一個(gè)包含了以下這些元素和屬性值的intent filter到你的manifest中:
指定ACTION_VIEW的操作,使得Google搜索可以觸及intent filter。
添加一個(gè)或多個(gè)<data>
標(biāo)簽,每一個(gè)標(biāo)簽代表一種activity對(duì)URI格式的解析,<data>
必須至少包含android:scheme屬性。
你可以添加額外的屬性來(lái)改善activity所接受的URI類型。例如,你或許有幾個(gè)activity可以接受相似的URI,它們僅僅是路徑名不同。在這種情況下,使用android:path屬性或它的變形(pathPattern
或pathPrefix
),使系統(tǒng)能辨別對(duì)不同的URI路徑應(yīng)該啟動(dòng)哪個(gè)activity。
包括BROWSABLE category。BROWSABLE category對(duì)于使intent filter能被瀏覽器訪問(wèn)是必要的。沒(méi)有這個(gè)category,在瀏覽器中點(diǎn)擊鏈接無(wú)法解析到你的app。DEFAULT category是可選的,但建議添加。沒(méi)有這個(gè)category,activity只能夠使用app組件名稱以顯示(explicit)intent啟動(dòng)。
下面的一段XML代碼向你展示,你應(yīng)該如何在manifest中為深度鏈接指定一個(gè)intent filter。URI “example://gizmos” 和 “http://www.example.com/gizmos” 都能夠解析到這個(gè)activity。
<activity
android:name="com.example.android.GizmosActivity"
android:label="@string/title_gizmos" >
<intent-filter android:label="@string/filter_title_viewgizmos">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- 接受以"example://gizmos”開(kāi)頭的 URIs -->
<data android:scheme="example"
android:host="gizmos" />
<!-- 接受以"http://www.example.com/gizmos”開(kāi)頭的 URIs -->
<data android:scheme="http"
android:host="www.example.com"
android:pathPrefix="gizmos" />
</intent-filter>
</activity>
當(dāng)你把包含有指定activity內(nèi)容的URI的intent filter添加到你的app manifest后,Android就可以在你的app運(yùn)行時(shí),為app與匹配URI的Intent建立路徑。
Note: 對(duì)一個(gè)URI pattern,intent filter可以只包含一個(gè)單一的
data
元素,創(chuàng)建不同的intent filter來(lái)匹配額外的URI pattern。
學(xué)習(xí)更多關(guān)于定義intent filter,見(jiàn)Allow Other Apps to Start Your Activity
一旦系統(tǒng)通過(guò)一個(gè)intent filter啟動(dòng)你的activity,你可以使用由Intent提供的數(shù)據(jù)來(lái)決定需要處理什么。調(diào)用[getData()](http://developer.android.com/reference/android/content/Intent.html#getData())和[getAction()](http://developer.android.com/reference/android/content/Intent.html#getAction())方法來(lái)取出傳入[Intent](http://developer.android.com/reference/android/content/Intent.html)中的數(shù)據(jù)與操作。你可以在activity生命周期的任何時(shí)候調(diào)用這些方法,但一般情況下你應(yīng)該在前期回調(diào)如[onCreate()](http://developer.android.com/reference/android/app/Activity.html#onCreate(android.os.Bundle))或[onStart()](http://developer.android.com/reference/android/app/Activity.html#onStart())中調(diào)用。
這個(gè)是一段代碼,展示如何從Intent中取出數(shù)據(jù):
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent intent = getIntent();
String action = intent.getAction();
Uri data = intent.getData();
}
遵守下面這些慣例來(lái)提高用戶體驗(yàn):
深度鏈接應(yīng)直接為用戶打開(kāi)內(nèi)容,不需要任何提示,插播式廣告頁(yè)和登錄頁(yè)面。要確保用戶能看到app的內(nèi)容,即使之前從沒(méi)打開(kāi)過(guò)這個(gè)應(yīng)用。當(dāng)用戶從啟動(dòng)器打開(kāi)app時(shí),可以在操作結(jié)束后給出提示。這個(gè)準(zhǔn)則也同樣適用于網(wǎng)站的first click free體驗(yàn)。
你可以使用Android Debug Bridge和activity管理(am)工具來(lái)測(cè)試你指定的intent filter URI,能否正確解析到正確的app activity。你可以在設(shè)備或者模擬器上運(yùn)行adb命令。
測(cè)試intent filter URI的一般adb語(yǔ)法是:
$ adb shell am start
-W -a android.intent.action.VIEW
-d <URI> <PACKAGE>
例如,下面的命令試圖瀏覽與指定URI相關(guān)的目標(biāo)app activity。
$ adb shell am start
-W -a android.intent.action.VIEW
-d "example://gizmos" com.example.android