Intent過濾器是一種根據(jù)Intent中的動作(Action)、類別(Categorie)和數(shù)據(jù)(Data)等內(nèi)容,對適合接收該Intent的組件進行匹配和篩選的機制。它可以匹配數(shù)據(jù)類型、路徑和協(xié)議,還可以用來確定多個匹配項順序的優(yōu)先級(Priority)。
應(yīng)用程序的Activity組件、Service組件和BroadcastReceiver都可以注冊Intent過濾器,這些組件在特定的數(shù)據(jù)格式上就可以產(chǎn)生相應(yīng)的動作。
注冊Intent過濾器的方法如下:
在AndroidManifest.xml文件的各個組件的節(jié)點下定義<intent-filter>節(jié)點,然后在<intent-filter>節(jié)點中聲明該組件所支持的動作、執(zhí)行的環(huán)境和數(shù)據(jù)格式等信息。
<intent-filter>節(jié)點支持<action>標簽、<category>標簽和<data>標簽,其中:<action>標簽定義Intent過濾器的“類別”;<category>標簽定義Intent過濾器的“動作”;<data>標簽定義Intent過濾器的“數(shù)據(jù)”。
<intent-filter>節(jié)點支持的標簽和屬性如表6-4所示。
表6-4 <intent-filter>節(jié)點支持的標簽和屬性
標 簽 |
屬 性 |
說 明 |
<action> |
Android:name |
指定組件所能響應(yīng)的動作,用字符串表示,通常使用Java類名和包的完全限定名構(gòu)成 |
<category> |
Android:category |
指定以何種方式去服務(wù)Intent請求的動作 |
<data> |
Android:host |
指定一個有效的主機名 |
Android:mimetype |
指定組件能處理的數(shù)據(jù)類型 |
Android:path |
有效的Uri路徑名 |
Android:port |
主機的有效端口號 |
Android:scheme |
所需要的特定的協(xié)議 |
<category>標簽用來指定Intent過濾器的服務(wù)方式,每個Intent過濾器可以定義多個<category>標簽,程序開發(fā)人員可使用自定義的類別,或使用Android系統(tǒng)提供的類別。其中,Android系統(tǒng)提供的類別如表6-5所示。
表6-5 Android系統(tǒng)提供的類別
值 |
說 明 |
ALTERNATIVE |
Intent數(shù)據(jù)默認動作的一個可替換的執(zhí)行方法 |
SELECTED_ALTERNATIVE |
和ALTERNATIVE類似,但替換的執(zhí)行方法不是指定的,而是被解析出來的 |
BROWSABLE |
聲明Activity可以由瀏覽器啟動 |
續(xù)表
值 |
說 明 |
DEFAULT |
為Intent過濾器中定義的數(shù)據(jù)提供默認動作 |
HOME |
設(shè)備啟動后顯示的第一個Activity |
LAUNCHER |
在應(yīng)用程序啟動時首先被顯示 |
AndroidManifest.xml文件中的每個組件的<intent-filter>都被解析成一個Intent過濾器對象。當應(yīng)用程序安裝到Android系統(tǒng)時,所有的組件和Intent過濾器都會注冊到Android系統(tǒng)中。這樣,Android系統(tǒng)便知道了如何將任意一個Intent請求通過Intent過濾器映射到相應(yīng)的組件上。