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堆棧。