以前一直搞不很明白 AndroidManifest.xml 中 activity 標籤下的 intent-filter 中 data 標籤的屬性含義,今天認真看了 Dev Guide,又在網上查詢了大量相關資料,現把 data 標籤中的屬性含義作一個總結。
html
1、定義
android
scheme, host, port, path, pathPrefix, pathPattern 是用來匹配 Intent 中的 Data Uri 的。具體規則以下:
瀏覽器
scheme://host:port/path or pathPrefix or pathPattern
網絡
這裏須要注意的是這裏的 scheme 不是 schema,也許你記得 xmlns:android="http://schemas.android.com/apk/res/android" 這段聲明,你就會想起其中的 schema (至少我是這樣想到了...- -!),但這裏的 scheme 不是 schema。雖然在寫 AndroidManifest.xml 的時候,有智能提示,可是但願你們仍是能注意到。ide
上面那句最後的 「path or pathPrefix or pathPattern」 是指後面的 path 驗證可使用 data 屬性中的 android:path、android:pathPrefix 或 pathPattern,你能夠添加任意個 data 標籤,因爲是 「or」 ,所以,只要其中任意一個 data 匹配,系統就會選擇你的 Activity 啓動,固然,若是別的 Activity 也有相同的 data 標籤,系統就會給用戶彈出一個 Chooser Dialog。ui
mimeType 也是是用來匹配 Intent 的。好比,當你使用 Intent.setType("text/plain") ,那麼系統將會匹配到全部註冊 android:mimeType="text/plain" 的 Activity,想獲取更多有關 mimeType 的知識請參考:【轉】備份:Android 經常使用 mimeType 表。google
這裏須要十分注意的是 Intent.setType(), Intent.setData,Intent.setDataAndType() 這三個方法!
spa
1 <intent-filter> 2 <action android:name="android.intent.action.VIEW"></action> 3 <category android:name="android.intent.category.DEFAULT"></category> 4 <data android:scheme="http" android:pathPattern=".*\\.pdf"></data> 5 </intent-filter>
若是你只想處理某個站點的 pdf,那麼在 data 標籤裏增長 android:host="yoursite.com" 則只會匹配 http://yoursite.com/xxx/xxx.pdf,但這不會匹配 www.yoursite.com,若是你也想匹配這個站點的話,你就須要再添加一個 data 標籤,除了 android:host 改成 「www.yoursite.com」 其餘都同樣。
code
1 <intent-filter> 2 <action android:name="android.intent.action.SEND" /> 3 <category android:name="android.intent.category.DEFAULT" /> 4 <data mimeType="*/*" /> 5 </intent-filter>
這裏設置 category 的緣由是,建立的 Intent 的實例默認 category 就包含了 Intent.CATEGORY_DEFAULT ,google 這樣作的緣由是爲了讓這個 Intent 始終有一個 category。xml
1 <intent-filter> 2 <action android:name="android.intent.action.VIEW" /> 3 <category android:name="android.intent.category.DEFAULT" /> 4 <data android:mimeType="audio/*" /> 5 </intent-filter>