Intent、IntentFilter的匹配規(guī)則

1、Intent的概念:

Android中提供了Intent機制來協(xié)助應(yīng)用間的交互與通訊,或者采用更準(zhǔn)確的說法是,Intent不僅可用于應(yīng)用程序之間,也可用于應(yīng)用程序內(nèi)部的activity, service和broadcast receiver之間的交互。Intent這個英語單詞的本意是“目的、意向、意圖”。

Intent是一種運行時綁定(runtime binding)機制,它能在程序運行的過程中連接兩個不同的組件。通過Intent,你的程序可以向Android表達(dá)某種請求或者意愿,Android會根據(jù)意愿的內(nèi)容選擇適當(dāng)?shù)慕M件來響應(yīng)。

activity、service和broadcast receiver之間是通過Intent進(jìn)行通信的,而另外一個組件Content Provider本身就是一種通信機制,不需要通過Intent。

二、Intent的相關(guān)屬性:

Intent由以下各個組成部分:

component(組件):目的組件

action(動作):用來表現(xiàn)意圖的行動

category(類別):用來表現(xiàn)動作的類別

data(數(shù)據(jù)):表示與動作要操縱的數(shù)據(jù)

type(數(shù)據(jù)類型):對于data范例的描寫

extras(擴展信息):擴展信息

Flags(標(biāo)志位):期望這個意圖的運行模式

Intent類型分為顯式Intent(直接類型)、隱式Intent(間接類型)。官方建議使用隱式Intent。上述屬性中,component屬性為直接類型,其他均為間接類型。

三、intent的相關(guān)應(yīng)用

1、component(組件):目的組件

Component屬性明確指定Intent的目標(biāo)組件的類名稱。(屬于直接Intent)

如果 component這個屬性有指定的話,將直接使用它指定的組件。指定了這個屬性以后,Intent的其它所有屬性都是可選的。

2、Action(動作):用來表現(xiàn)意圖的行動

Intent中,Action就是描述做、寫等動作的,當(dāng)你指明了一個Action,執(zhí)行者就會依照這個動作的指示,接受相關(guān)輸入,表現(xiàn)對應(yīng)行為,產(chǎn)生符合的輸出。在Intent類中,定義了一批量的動作,比如ACTION_VIEW,ACTION_PICK等, 基本涵蓋了常用動作。加的動作越多,越精確。

Action 是一個用戶定義的字符串,用于描述一個 Android 應(yīng)用程序組件,一個 Intent Filter 可以包含多個 Action。action的匹配規(guī)則是Intent中的action必須能和過濾規(guī)則中的action匹配,一個過濾規(guī)則中可以有多個action,那么只有intent中的action能和過濾規(guī)則中的任何一個action相同即可匹配成功。

3、category(類別):用來表現(xiàn)動作的類別,category的匹配規(guī)則和action不同,它要求Intent中如果含有category,那么所有的category都必須和過濾規(guī)則中的其中以一個category相同。換句話說Intent中不管出現(xiàn)幾個category,對于每一個category來說,他必須是過濾規(guī)則中已經(jīng)定義的category。

4、data(數(shù)據(jù)):表示與動作要操縱的數(shù)據(jù)

Data屬性是Android要訪問的數(shù)據(jù),和action和Category聲明方式相同,也是在IntentFilter中。

多個組件匹配成功顯示優(yōu)先級高的; 相同顯示列表。

date的匹配規(guī)則和action類似,如果過濾規(guī)則里面定義了data,那么Intent中必須也要定義與之匹配的data。data一般情況有兩部分組成,mimeType和URI。mimeType指媒體類型,比如說image/jpeg和video/*等,可以表示圖片、文本、視頻等不同的媒體格式,而Uri中包含的數(shù)據(jù)就比較多了。uri的結(jié)構(gòu)為<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]

Scheme:URI的模式,比如http、file、content等,如果URI中沒有指定Scheme,那么整個URI的其他參數(shù)無效,這也意味著URI是無效的。

Host:URI的主機名,比如說www.baidu.com,如果host未指定,那么整個URI中的其他參數(shù)也是無效的。

Port:URI中的端口號,比如說80,僅當(dāng)URI中指定了scheme和host參數(shù)的時候port參數(shù)才有意思。

Path、pathPattern和pathPrefix:這三個參數(shù)表述路徑信息,其中path表示完整的路徑信息;pathPattern也表示完整的路徑信息,但它里面可以包含通配符“*”,“*”表示0個或多個任意的字符,需要注意的是,由于正則表達(dá)式所以“*”要寫成“\\*”,"\"要寫成“\\\\”;pathPrefix表示路徑的前綴信息。

5、type(數(shù)據(jù)類型):對于data范例的描寫

如果Intent對象中既包含Uri又包含Type,那么,在中也必須二者都包含才能通過測試。

Type屬性用于明確指定Data屬性的數(shù)據(jù)類型或MIME類型,但是通常來說,當(dāng)Intent不指定Data屬性時,Type屬性才會起作用,否則Android系統(tǒng)將會根據(jù)Data屬性值來分析數(shù)據(jù)的類型,所以無需指定Type屬性。

data和type屬性一般只需要一個,通過setData方法會把type屬性設(shè)置為null,相反設(shè)置setType方法會把data設(shè)置為null,如果想要兩個屬性同時設(shè)置,要使用Intent.setDataAndType()方法。

6、extras(擴展信息):擴展信息

是其它所有附加信息的集合。使用extras可以為組件提供擴展信息,比如,如果要執(zhí)行“發(fā)送電子郵件”這個

動作,可以將電子郵件的標(biāo)題、正文等保存在extras里,傳給電子郵件發(fā)送組件。

7、Flags(標(biāo)志位):期望這個意圖的運行模式

一個程序啟動后系統(tǒng)會為這個程序分配一個task供其使用,另外同一個task里面可以擁有不同應(yīng)用程序的activity。那么,同一個程序能不能擁有多個task?這就涉及到加載activity的啟動模式,這個需要單獨講一下。

注:android中一組邏輯上在一起的activity被叫做task,自己認(rèn)為可以理解成一個activity堆棧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Intent組件雖然不是四大組件,但卻是連接四大組件的橋梁,學(xué)習(xí)好這個知識,也非常的重要。 一、什么是Intent...
    困惑困惑困惑閱讀 1,540評論 0 0
  • Intent簡介Android中提供了Intent機制來協(xié)助應(yīng)用間的交互與通訊,Intent負(fù)責(zé)對應(yīng)用中一次操作的...
    Android_lml閱讀 981評論 1 7
  • 好萌的小哥哥【靜靜手繪頭像】日漫風(fēng) 單人25元,絕對的實惠哦。你買不了吃虧,買不了上當(dāng)。你發(fā)自拍,我就畫。嘿嘿
    靜靜手繪閱讀 779評論 0 0
  • 微信是很成功的應(yīng)用,我們可以通過分析微信的迭代過程,發(fā)現(xiàn)一些值得我們借鑒的產(chǎn)品思想。 微信上線的第一個版本只有...
    昆言昆語閱讀 41,625評論 9 217
  • 挑戰(zhàn)十一假期7天-每天一本書(目標(biāo)11/100本) 收拾行李+使用出行清單 繼續(xù)閱讀《窮查理寶典》80% 挑戰(zhàn)十一...
    伽藍(lán)214閱讀 104評論 0 0