簡(jiǎn)述 IntentFilter(意圖過(guò)濾器)
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
![]() ![]() 簡(jiǎn)述 IntentFilter(意圖過(guò)濾器)1.什么是IntentFilter ? IntentFilter翻譯成中文就是“意圖過(guò)濾器”,主要用來(lái)過(guò)濾隱式意圖。當(dāng)用戶進(jìn)行一項(xiàng)操作的時(shí)候,Android系統(tǒng)會(huì)根據(jù)配置的 “意圖過(guò)濾器” 來(lái)尋找可以響應(yīng)該操作的組件,服務(wù)。 例如:當(dāng)用戶點(diǎn)擊PDF文件的時(shí)候,Android系統(tǒng)就會(huì)通過(guò)設(shè)定好的意圖過(guò)濾器,進(jìn)行匹配測(cè)試。找到能夠打開(kāi)PDF文件的APP程序。 代碼: <activity android:name="com.example.testmain.ShowActivity" > <intent-filter> <action android:name="test.update.mydata" /> <category android:name="my.test.show" /> <data android:pathPattern=".*\\.jpg" android:scheme="http" /> </intent-filter> </activity>
2.IntentFilter 如何過(guò)濾隱式意圖? Android系統(tǒng)會(huì)根據(jù)我們配置的Intent Filter(意圖過(guò)濾器),來(lái)進(jìn)行匹配測(cè)試。匹配的時(shí)候,只會(huì)考慮三個(gè)方面:動(dòng)作、數(shù)據(jù)(URI以及數(shù)據(jù)類型)和類別。也就是說(shuō)Android系統(tǒng)會(huì)進(jìn)行“動(dòng)作測(cè)試”,“數(shù)據(jù)測(cè)試”,“類別測(cè)試”,來(lái)尋找可以響應(yīng)隱式意圖的組件或服務(wù)。 另外,當(dāng)對(duì)其他App程序開(kāi)放組件和服務(wù)的時(shí)候也需要配置Intent Filter(意圖過(guò)濾器),一個(gè)Activity可以配置多個(gè)<intent-filter>。
3.動(dòng)作測(cè)試: 對(duì)應(yīng)<intent-filter>中的<action/>標(biāo)簽; (1) 如果<intent-filter>標(biāo)簽中有多個(gè)<action/>,那么Intent請(qǐng)求的Action,只要匹配其中的一條<action/>就可以通過(guò)了這條<intent-filter>的動(dòng)作測(cè)試。
(2) 如果<intent-filter>中沒(méi)有包含任何<action/>,那么無(wú)論什么Intent請(qǐng)求都無(wú)法和這條<intent-filter>匹配。
(2) 如果Intent請(qǐng)求中沒(méi)有設(shè)定Action(動(dòng)作),那么這個(gè)Intent請(qǐng)求就將順利地通過(guò)<intent-filter>的動(dòng)作測(cè)試(前提是<intent-filter>中必須包含有<action/>,否則與第二條沖突)。
4.類別測(cè)試:
對(duì)應(yīng)<intent-filter>中的<category />標(biāo)簽; (1)Intent中的類別必須全部匹配<intent-filter>中的<category />,但是<intent-filter>中多余的<category />將不會(huì)導(dǎo)致匹配失敗。 例如:Intent中有3個(gè)類別,而意圖過(guò)濾器中定義了5個(gè),如果Intent中的3個(gè)類別都與過(guò)濾器中的匹配,那么過(guò)濾器中的另外2個(gè),將不會(huì)導(dǎo)致類別測(cè)試失敗。
注意:有一個(gè)例外,Android把所有傳給startActivity()的隱式意圖當(dāng)作他們包含至少一個(gè)類別:"android.intent.category.DEFAULT" (CATEGORY_DEFAULT常量)。 因此,想要接收隱式意圖的活動(dòng)必須在它們的意圖過(guò)濾器中包含"android.intent.category.DEFAULT"。(帶"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"設(shè)置的過(guò)濾器是例外)
5.數(shù)據(jù)測(cè)試: 對(duì)應(yīng)<intent-filter>中的<data>標(biāo)簽; <data>元素指定了可以接受的Intent傳過(guò)來(lái)的數(shù)據(jù)URI和數(shù)據(jù)類型,當(dāng)一個(gè)意圖對(duì)象中的URI被用來(lái)和一個(gè)過(guò)濾器中的URI比較時(shí),比較的是URI的各個(gè)組成部分。 例如: 如果過(guò)濾器僅指定了一個(gè)scheme,所有該scheme的URIs都能夠和這個(gè)過(guò)濾器相匹配; 如果過(guò)濾器指定了一個(gè)scheme、主機(jī)名但沒(méi)有路經(jīng)部分,所有具有相同scheme和主機(jī)名的URIs都可以和這個(gè)過(guò)濾器相匹配,而不管它們的路經(jīng); 如果過(guò)濾器指定了一個(gè)scheme、主機(jī)名和路經(jīng),只有具有相同scheme、主機(jī)名和路經(jīng)的URIs才可以和這個(gè)過(guò)濾器相匹配。 當(dāng)然,一個(gè)過(guò)濾器中的路徑規(guī)格可以包含通配符,這樣只需要部分匹配即可。
(1) 一個(gè)既不包含URI也不包含數(shù)據(jù)類型的意圖對(duì)象,僅在過(guò)濾器也同樣沒(méi)有指定任何URI和數(shù)據(jù)類型的情況下才能通過(guò)測(cè)試。 (2)一個(gè)包含URI但沒(méi)有數(shù)據(jù)類型的意圖對(duì)象,僅在它的URI和一個(gè)同樣沒(méi)有指定數(shù)據(jù)類型的,過(guò)濾器里的URI匹配時(shí)才能通過(guò)測(cè)試。這通常發(fā)生在類似于mailto:和tel:這樣的URIs上:它們并不引用實(shí)際數(shù)據(jù)。 (3)一個(gè)包含數(shù)據(jù)類型但不包含URI的意圖對(duì)象,僅在這個(gè)過(guò)濾器列舉了同樣的數(shù)據(jù)類型,而且也沒(méi)有指定一個(gè)URI的情況下才能通過(guò)測(cè)試。 (4)一個(gè)同時(shí)包含URI和數(shù)據(jù)類型(或者可從URI推斷出數(shù)據(jù)類型)的意圖對(duì)象可以通過(guò)測(cè)試,如果它的類型和過(guò)濾器中列舉的類型相匹配的話。如果它的URI和這個(gè)過(guò)濾器中的一個(gè)URI相匹配或者它有一個(gè)內(nèi)容 content:或者文件file: URI,而且這個(gè)過(guò)濾器沒(méi)有指定一個(gè)URI,那么它也能通過(guò)測(cè)試。換句話說(shuō),一個(gè)組件被假定為支持 ”content: 數(shù)據(jù)“ 和 “file: 數(shù)據(jù)”,如果它的過(guò)濾器僅列舉了一個(gè)數(shù)據(jù)類型。
例如AndroidManifest.xml中有: <intent-filter> <action android:name="com.nanlove.wangshiming"/> <action android:name="wangshiming"/> <category android:name="android.intent.category.DEFAULT" /> <category android:name="wangshiming.intent.category"/> <data android:scheme="love" android:host="hao123.com"
對(duì)于<intent-filter>中的action項(xiàng)可以有多個(gè)只要匹配其中一個(gè)就可以了
intent.setAction("com.nanlove.wangshiming");//中的action也可以為wangshiming intent.addCategory("wangshiming.intent.category")代碼中的addCategory并不用寫(xiě)因?yàn)閍ndroid他有默認(rèn)的category 只要配置清單中存在<category android:name="android.intent.category.DEFAULT" />就可以了. 沒(méi)有 "數(shù)據(jù)參數(shù)" 的情況下只要意圖對(duì)象中的設(shè)置動(dòng)作和類別都出現(xiàn)在intent-filter就能跟filter匹配,但是有數(shù)據(jù)<data android:scheme="love" android:host="hao123.com" android:port="888" android:path="/MM" />數(shù)據(jù)項(xiàng)一定要完全匹配。
當(dāng)數(shù)據(jù)和數(shù)據(jù)類型 android:mimeType="text/plain"同時(shí)存在的時(shí)候,不能使用intent.setData(Uri.parse("love://hao123.com:888/MM")) ; 因?yàn)閟etData的方法會(huì)自動(dòng)清除前面的數(shù)據(jù)類型:This method automatically clears any type that was previously set by setType; 所以后面的setType就無(wú)法匹配,應(yīng)該使用intent.setDataAndType(Uri.parse("love://hao123.com:888/MM"), "text/plain");
提示:在同一個(gè)應(yīng)用內(nèi),能使用顯示意圖,就盡量使用顯示意圖,增加程序的效率,理論上隱式意圖匹配規(guī)則是需要花時(shí)間尋找的。
參考地址:http://blog.csdn.net/zidan_2011/article/details/7433776 該文章在 2025/9/11 17:10:30 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |