Intent到Intent過濾器的映射過程稱為“Intent解析”。Intent解析可以在所有組件中找到一個可與請求的Intent達成佳匹配的Intent過濾器。
Intent解析的匹配規(guī)則。
Android系統(tǒng)把所有應用程序包中的Intent過濾器集合在一起,形成一個完整的Intent過濾器列表。
在Intent與Intent過濾器進行匹配時,Android系統(tǒng)會將列表中所有Intent過濾器的“動作”和“類別”與Intent進行匹配,任何不匹配的Intent過濾器都將被過濾掉。沒有指定“動作”的Intent過濾器可以匹配任何的Intent,但沒有指定“類別”的Intent過濾器只能匹配沒有“類別”的Intent。
把Intent數據Uri的每個子部與Intent過濾器的<data>標簽中的屬性進行匹配,如果<data>標簽指定了協(xié)議、主機名、路徑名或MIME類型,那么這些屬性都要與Intent的Uri數據部分進行匹配,任何不匹配的Intent過濾器均被過濾掉。
如果Intent過濾器的匹配結果多于一個,則可以根據在<intent-filter>標簽中定義的優(yōu)先級標簽來對Intent過濾器進行排序,優(yōu)先級高的Intent過濾器將被選擇。
在此以6.2.1節(jié)中隱式啟動Activity的例子WebViewIntentDemo為基礎,在AndroidManifest.xml文件中注冊Intent過濾器,以及設置<intent-filter>節(jié)點屬性來捕獲指定的Intent。
在AndroidManifest.xml中添加如代碼清單6-19所示。
代碼清單6-19 AndroidManifest.xml中添加代碼
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data android:schema="http" />
</intent-filter>
利用 <intent-filter> 可以把應用程序的操作注冊到系統(tǒng)中,當用戶調用 Intent 時,可以根據輸入的 ACTION 和 Uri參數來找到這個應用程序。例如,在上述代碼中,以 http 協(xié)議為例,打開 Google Map 可以用 URI: geo:38.899533,-77.036476。
此外,“協(xié)議”在 Android 里都可以隨便定義。例如,寫一個打開文件的關聯(lián) Intent,如 file:///sdcard/abc.txt。也可以用 type進行關聯(lián),其代碼如代碼清單6-20所示。
代碼清單6-20 用type進行關聯(lián)
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<type android:value="test.item"/>
</intent-filter>
然后,通過代碼清單6-21所示代碼就能定位到應用。
代碼清單6-21 用 type 定位到應用代碼
Intent it = new Intent(Intent.ACTION_VIEW);
it.setType("test.item”);
startActivity(it)