新聞中心
一、Intent和IntentFilter簡介

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),夾江企業(yè)網(wǎng)站建設(shè),夾江品牌網(wǎng)站建設(shè),網(wǎng)站定制,夾江網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,夾江網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
一個(gè)應(yīng)用程序的三個(gè)核心組件(活動(dòng),服務(wù)和廣播接收器)都是通過消息即意圖(Intents)來激活的。Intent消息傳送是相同或不同應(yīng)用中組件運(yùn)行時(shí)晚綁定的一種機(jī)制。意圖本身(一個(gè)意圖對象)是一個(gè)包含被執(zhí)行操作抽象描述的被動(dòng)的數(shù)據(jù)結(jié)構(gòu)。或,對于廣播而言,是某件已經(jīng)發(fā)生并被聲明的事情的描述。存在如下幾種不同的機(jī)制來傳送意圖到每種組件中:
- 一個(gè)意圖對象是傳遞給Context.startActivity()或者Activity.startActivityForResult()來啟動(dòng)一個(gè)活動(dòng)或者讓一個(gè)存在的活動(dòng)去做某些新的事情。
- 一個(gè)意圖對象是傳遞給Context.startService()來發(fā)起一個(gè)服務(wù)或者遞交新的指令給運(yùn)行中的服務(wù)。類似的,一個(gè)意圖能被傳遞給Context.bindService() 來在調(diào)用組件和一個(gè)目標(biāo)服務(wù)之間建立連接。作為一個(gè)可選項(xiàng),它可以發(fā)起這個(gè)服務(wù)如果還沒運(yùn)行的話。
- 傳遞給任意廣播方法(例如Context.sendBroadcast(),Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast())的意圖對象被傳遞給所有感興趣的廣播接收者。許多種廣播產(chǎn)生于系統(tǒng)代碼。
在每個(gè)例子里,Android系統(tǒng)找到合適的活動(dòng)、服務(wù)或者一組廣播接收者來回應(yīng)這個(gè)意圖,必要時(shí)實(shí)例化它們。這些消息傳送系統(tǒng)沒有重疊:廣播意圖僅被傳遞給廣播接收者,永遠(yuǎn)不會給活動(dòng)或者服務(wù)。一個(gè)傳送給startActivity()的意圖是只會被傳遞給一個(gè)活動(dòng),永遠(yuǎn)不會給一個(gè)服務(wù)或廣播接收者,如此類推。
為了通知系統(tǒng)它們可以處理哪些意圖,活動(dòng)、服務(wù)和廣播接收器可以有一個(gè)或多個(gè)意圖過濾器。每個(gè)過濾器描述組件的一個(gè)能力,一系列組件想要接收的意圖。它實(shí)際上按照一個(gè)期望的類型來進(jìn)行意圖濾入,同時(shí)濾出不想要的意圖-但是只有不想要的隱式意圖會被濾出(那些沒有命名目標(biāo)的對象類)。一個(gè)顯式意圖總能夠被遞交給它的目標(biāo),而無論它包含什么。這種情況下過濾器不起作用。但是一個(gè)顯式意圖僅當(dāng)它能通過組件的一個(gè)過濾器時(shí)才可以被遞交到這個(gè)組件。
組件為它能做的每項(xiàng)工作,每個(gè)呈現(xiàn)給用戶的不同方面分有不同的過濾器。比如,范例記事本應(yīng)用程序中的主要活動(dòng)有三個(gè)過濾器:一個(gè)是空白板,另一個(gè)是用戶可以查看、編輯、或選擇的一個(gè)指定的記事目錄,第三是在沒有初始目錄說明的情況下查找一個(gè)特定的記錄。一個(gè)意圖過濾器是IntentFilter類的一個(gè)實(shí)例。但是,由于Android系統(tǒng)在啟動(dòng)一個(gè)組件前必須知道這個(gè)組件的能力,意圖過濾器通常不會用Java代碼來設(shè)置,而是在應(yīng)用程序清單文件(AndroidManifest.xml)中設(shè)置
二 、過濾器與安全Filters and security
我們不能信賴一個(gè)意圖過濾器的安全性。當(dāng)它打開一個(gè)組件來接收某些特定類型的隱式意圖,它并不能阻止以這個(gè)組件為目標(biāo)的顯式意圖。即使過濾器對組件要處理的意圖限制某些動(dòng)作和數(shù)據(jù)源,總有人能把一個(gè)顯式意圖和一個(gè)不同的動(dòng)作及數(shù)據(jù)源組合在一起,然后命名該組件為目標(biāo)。
一個(gè)過濾器和意圖對象有同樣的動(dòng)作、數(shù)據(jù)以及類別字段。一個(gè)隱式意圖在過濾器的所有三個(gè)方面都被測試。為了遞交到擁有這個(gè)過濾器的組件,它必須通過所有這三項(xiàng)測試。即便只有一個(gè)不通過,Android系統(tǒng)都不會把它遞交給這個(gè)組件。不過,由于一個(gè)組件可以包含多個(gè)意圖過濾器,一個(gè)不能通過其中一個(gè)組件過濾器的意圖可能在另外的過濾器上獲得通過。
與之相關(guān)的三個(gè)測試詳細(xì)描述如下:
測試一:動(dòng)作測試(Actiontest)
清單文件中的意圖過濾器元素里列舉了動(dòng)作元素,比如:
- . . .
如同例子所示,一個(gè)意圖對象只對單個(gè)動(dòng)作命名,而一個(gè)過濾器可能列舉多個(gè)。列表不能為空;一個(gè)過濾器必須包含至少一個(gè)動(dòng)作元素,否則它將阻塞所有的意圖。
為了通過這個(gè)測試,在意圖對象中指定的動(dòng)作必須匹配過濾器中所列舉的動(dòng)作之一。如果意圖對象或過濾器不指定一個(gè)動(dòng)作,結(jié)果將是:如果這個(gè)過濾器沒有列出任何動(dòng)作,那意圖就沒有什么可匹配的,因此所有的意圖都會測試失敗。沒有意圖能夠通過這個(gè)過濾器。另一方面,一個(gè)未指定動(dòng)作的意圖對象自動(dòng)通過這個(gè)測試-只要過濾器包含至少一個(gè)動(dòng)作。
測試二:類別測試(Categorytest)
一個(gè)意圖過濾器
- . . .
注意前面描述的動(dòng)作和類別常量沒有在清單文件中使用。相反使用了完整的字符串。比如,對應(yīng)于前述CATEGORY_BROWSABLE常量,上面的例子里使用了"android.intent.category.BROWSABLE"字符串。類似的,字符串"android.intent.action.EDIT" 對應(yīng)于ACTION_EDIT常量。
對一個(gè)通過類別測試的意圖,每個(gè)意圖對象中的類別必須匹配一個(gè)過濾器中的類別。這個(gè)過濾器可以列舉另外的類別,但它不能遺漏任何在這個(gè)意圖中的類別。
因此,原則上一個(gè)沒有類別的意圖對象應(yīng)該總能夠通過測試,而不管過濾器里有什么。絕大部分情況下這個(gè)是對的。但有一個(gè)例外,Android把所有傳給startActivity()的隱式意圖當(dāng)作他們包含至少一個(gè)類別:"android.intent.category.DEFAULT"(CATEGORY_DEFAULT常量)。 因此,想要接收隱式意圖的活動(dòng)必須在它們的意圖過濾器中包含"android.intent.category.DEFAULT"。,而帶"android.intent.action.MAIN"和"android.intent.category.LAUNCHER"設(shè)置的過濾器是例外。它們標(biāo)記那些啟動(dòng)新任務(wù)和呈現(xiàn)在啟動(dòng)屏幕的活動(dòng)。它們可以在類別列表中包含"android.intent.category.DEFAULT",但不是必要的。
測試三:數(shù)據(jù)測試(Data test)
就像動(dòng)作和類別,一個(gè)意圖過濾器的數(shù)據(jù)規(guī)格被包含在一個(gè)子元素中。而且這個(gè)子元素可以出現(xiàn)多次或一次都不出現(xiàn)。例如:
- . . .
每個(gè)數(shù)據(jù)元素可以指定一個(gè)URI和一個(gè)數(shù)據(jù)類型(MIME媒體類型)。有一些單獨(dú)的屬性-模式,主機(jī),端口和路徑-URI的每個(gè)部分:
| scheme://host:port/path |
比如,在下面的URI里面,
| content://com.example.project:200/folder/subfolder/etc |
模式是"內(nèi)容",主機(jī)是"com.example.project",端口是"200",路經(jīng)是"folder/subfolder/etc"。主機(jī)和端口一起組成URI鑒權(quán)(authority);如果未指定主機(jī),端口會被忽略。
這些屬性都是可選的,但彼此有依賴關(guān)系:一個(gè)授權(quán)要有意義,必須指定一個(gè)模式。一個(gè)路經(jīng)要有意義,必須同時(shí)指定模式和鑒權(quán)。
當(dāng)一個(gè)意圖對象中的URI被用來和一個(gè)過濾器中的URI規(guī)格比較時(shí),它實(shí)際上比較的是上面提到的URI的各個(gè)部分。比如,如果過濾器僅指定了一個(gè)模式,所有那個(gè)模式的URIs和這個(gè)過濾器相匹配;如果過濾器指定了一個(gè)模式、鑒權(quán)但沒有路經(jīng),所有相同模式和鑒權(quán)的URIs可以匹配上,而不管它們的路經(jīng);如果過濾器指定了一個(gè)模式、鑒權(quán)和路經(jīng),只有相同模式、鑒權(quán)和路經(jīng)的URIs可以匹配上。當(dāng)然,一個(gè)過濾器中的路徑規(guī)格可以包含通配符,這樣只需要部分匹配即可。
數(shù)據(jù)元素的類型屬性指定了數(shù)據(jù)的MIME類型。這在過濾器里比在URI里更為常見。意圖對象和過濾器都可以使用一個(gè)"*"通配符指定子類型字段-比如,"text/*"或者"audio/*"-指示任何匹配的子類型。
數(shù)據(jù)測試同時(shí)比較意圖對象和過濾器中指定的URI和數(shù)據(jù)類型。規(guī)則如下:
1) 一個(gè)既不包含URI也不包含數(shù)據(jù)類型的意圖對象僅在過濾器也同樣沒有指定任何URIs和數(shù)據(jù)類型的情況下才能通過測試。
2) 一個(gè)包含URI但沒有數(shù)據(jù)類型的意圖對象僅在它的URI和一個(gè)同樣沒有指定數(shù)據(jù)類型的過濾器里的URI匹配時(shí)才能通過測試。這通常發(fā)生在類似于mailto:和tel:這樣的URIs上:它們并不引用實(shí)際數(shù)據(jù)。
3) 一個(gè)包含數(shù)據(jù)類型但不包含URI的意圖對象僅在這個(gè)過濾器列舉了同樣的數(shù)據(jù)類型而且也沒有指定一個(gè)URI的情況下才能通過測試。
4) 一個(gè)同時(shí)包含URI和數(shù)據(jù)類型(或者可從URI推斷出數(shù)據(jù)類型)的意圖對象可以通過測試,如果它的類型和過濾器中列舉的類型相匹配的話。如果它的URI和這個(gè)過濾器中的一個(gè)URI相匹配或者它有一個(gè)內(nèi)容content:或者文件file: URI而且這個(gè)過濾器沒有指定一個(gè)URI,那么它也能通過測試。換句話說,一個(gè)組件被假定為支持content:和file: 數(shù)據(jù)如果它的過濾器僅列舉了一個(gè)數(shù)據(jù)類型。
如果一個(gè)意圖可以通過不止一個(gè)活動(dòng)或服務(wù)的過濾器,用戶可能會被詢問要激活那個(gè)組件,并且,如果沒有發(fā)現(xiàn)目標(biāo)對象將會出現(xiàn)異常。
當(dāng)前文章:專家專欄:Android中的Intent Filter與安全
本文來源:http://www.5511xx.com/article/ccicphg.html


咨詢
建站咨詢
