1.定義html
intent是一種運行時綁定機制, 是一種利用消息進行交互的機制。與intent有關的2個類是IntentFilter和IntentReceiver。Intent提供activity、service、BroadcastReceiver以及底層應用之間的相互觸發和數據交互(運行時綁定)。intent描述了一次操做的動做、動做涉及的數據和附加數據,intent用於通知系統內核調用intent明確或模糊指定的應用。intent分紅2類:(1)顯式intent:顯式intent直接指定須要啓動的組件的名字來啓動activity、service或BroadcastReceiver。即直接指定了component屬性的Intent(調用setComponent(ComponentName)或者setClass(Context, Class)來指定)。經過指定具體的組件類,通知應用啓動對應的組件。(2)隱式intent:隱式intent無需指定目標應用的名字,只需選擇性的指定Intent的Action、type以及category的屬性,則具備過濾這些Intent的4大組件就能被這些Intent激活。android
Android的核心Intent:鏈接4大組件的紐帶Intent是一種利用消息進行交互的機制。Intent對象描述了應用中一次操做的動做、涉及的數據和附加數據,FrameWork經過Intent的描述調用對應的用戶的應用、底層應用、service、activity或BroadcastReceiver。Intent提供了組件之間的延遲綁定機制。經過Intent調用底層應用必須設置底層應用許可。瀏覽器
2.發送Intent激活不一樣組件的方法
app
1)、要激活一個新的Activity,或者讓一個現有的Activity作新的操做,能夠經過調用Context.startActivity()或者Activity.startActivityForResult()方法。 ide
2)、要啓動一個新的Service,或者向一個已有的Service傳遞新的指令,調用Context.startService()方法或者調用Context.bindService()方法將調用此方法的上下文對象與Service綁定。測試
3)、廣播Intent的發送:Context.sendBroadcast()、Context.sendOrderBroadcast()、Context.sendStickBroadcast()這三個方法能夠發送Broadcast Intent。發送以後,全部已註冊的而且擁有與之相匹配IntentFilter的BroadcastReceiver就會被激活。 底層應用也是經過廣播來接收Intent。spa
4.Intent的不交疊性component
不一樣方法發送的Intent一旦發出,Android都會準確找到與Intent屬性描述相匹配的一個或多個Activity,Service或者BroadcastReceiver做響應。因此,不一樣類型的Intent消息不會出現重疊,即Broadcast的Intent消息只會發送給BroadcastReceiver,而決不會發送給Activity或者Service。由startActivity()傳遞的消息也只會發給Activity,由startService()傳遞的Intent只會發送給Service。xml
5.Intent工做原理htm
你的程序向Android發送一個Inent請求,Android會根據Intent的內容在註冊的IntentFilter中選擇適當的組件來響應。好比,有一個Activity但願打開網頁瀏覽器查看某一網頁的內容,那麼這個Activity只須要發出WEB_SEARCH_ACTION請求給Android,Android會根據Intent的請求內容,查詢各組件註冊時聲明的IntentFilter,匹配該Inent的IntentFilter所在的組件將會被FrameWork自動激活。
6.Intent經過下面的屬性來準確的標定某種意圖
1)、component(目標組件):目標組件的類名。設置了該屬性即爲顯式Intent
2)、Action(動做):用來表示意圖的動做,如:查看,發郵件,打電話
3)、category(類別):用來表示動做的類別。
4)、type(數據類型):對data類型的描述。
5)、data(數據):表示與動做要操做的數據。如:查看 聯繫人
6)、extras(附件信息):附件信息。如:詳細資料,一個文件,某事。
7.FrameWork對Intent解析機制-查找IntentFilter並匹配的過程
顯式Intent直接用組件的名稱定義目標組件,這種方式很直接,不須要解析。顯式Intent多用於在應用程序內部傳遞消息。好比在某應用程序內,一個Activity啓動一個Service。
隱式Intent偏偏相反,因爲開發人員每每並不清楚別的應用程序的組件名稱,它不會用組件名稱定義須要激活的目標組件,而是經過Intent的Action、type以及category的屬性定義須要激活的目標組件,具備匹配這些屬性的IntentFilter的組件將被FrameWork激活。
8.隱式Intent解析機制
該機制是FrameWork經過查找已註冊在AndroidManifest.xml中的全部<intent-filter>及其中定義的Intent,經過PackageManager(注:PackageManager可以獲得當前設備上所安裝的
application package的信息)來查找能處理這個Intent的component。在這個解析過程當中,對於隱式Intent,Android是經過Intent的action、type、category這三個屬性來進行判斷的,判斷方法以下:
1)、若是Intent指明定了action,則目標組件的IntentFilter的action列表中就必須包含有這個action,不然不能匹配;
2)、若是Intent沒有提供type,系統將從data中獲得數據類型。和action同樣,目標組件的數據類型列表中必須包含Intent的數據類型,不然不能匹配;若是Intent中的數據不是content:類型的URI,並且Intent也沒有明確指定type,將根據Intent中數據的scheme(好比 http:或者mailto:)進行匹配。同上,Intent 的scheme必須出如今目標組件的scheme列表中。
3)、若是Intent指定了一個或多個category,這些類別必須所有出如今組建的類別列表中。好比Intent中包含了兩個類別:LAUNCHER_CATEGORY和ALTERNATIVE_CATEGORY,解析獲得的目標組件必須至少包含這兩個類別。
一個隱式Intent請求要可以傳遞給目標組件,必要所有經過Action、Data以及Category這三個方面的檢查。若是任何一方面不匹配,Android都不會將該隱式Intent傳遞給目標組件。下面是這三方面檢查的具體規則。
9.Action、Data以及Category的檢查規則:
IntentFilter指定的屬性必須徹底包含Intent指定的屬性,這樣就能匹配。
1).動做測試(任意一個匹配便可)
<intent-filter>元素中能夠包括子元素<action>,好比:[xhtml] view plaincopy
<intent-filter>
<action android:name="com.example.project.SHOW_CURRENT" />
<action android:name="com.example.project.SHOW_RECENT" />
<action android:name="com.example.project.SHOW_PENDING" />
</intent-filter>
一條<intent-filter>元素至少應該包含一個<action>,不然任何Intent請求都不能和該<intent-filter>匹配;若是Intent請求的Action和<intent-filter>中個某一條<action>匹配,那麼該Intent就經過了這條<intent-filter>的動做測試;若是Intent請求或<intent-filter>中沒有說明具體的Action類型,那麼會出現下面兩種狀況:
a. 若是<intent-filter>中沒有包含任何Action類型,那麼不管什麼Intent請求都沒法和這條<intent-filter>匹配。
b. 反之,若是Intent請求中沒有設定Action類型,那麼只要<intent-filter>中包含有Action類型,這個Intent請求就將順利地經過<intent-filter>的行爲測試。
2).類別測試(任意一個匹配便可)
<intent-filter>元素能夠包含<category>子元素,好比:[xhtml] view plaincopy
<intent-filter . . . >
<category android:name="android.Intent.Category.DEFAULT" />
<category android:name="android.Intent.Category.BROWSABLE" />
</intent-filter>
只有當Intent請求中全部的Category與組件中某一個IntentFilter的<category>徹底匹配時,纔會讓該Intent請求經過測試,IntentFilter中多餘的<category>聲明並不會致使匹配失敗。一個沒有指定任何類別測試的IntentFilter僅僅只會匹配沒有設置類別的Intent請求。
3).數據測試(任意一個匹配便可)
數據在<intent-filter>中的描述以下:[xhtml] view plaincopy
<intent-filter . . . >
<data android:type="video/mpeg" android:scheme="http" . . . />
<data android:type="audio/mpeg" android:scheme="http" . . . />
</intent-filter>
<data>接受元素指定了但願的Intent請求的數據URI和數據類型,URI被分紅三部分來進行匹配:scheme、authority和path。其中,用setData()設定的Intent請求的URI數據類型和scheme必須與IntentFilter中所指定的一致。若IntentFilter中還指定了authority或path,它們也須要相匹配纔會經過測試。