Android Intent Filter 簡析,androidintent
在 Activity 和 Service 中,Intent 代表了對某個資料集上執行動作的請求,Intent Filter 則聲明了一個特定的應用程式組件能夠對一個類型的資料進行操作
要把一個Acitivty或者service註冊為一個可能的Intent處理常式,可以再它的mainfest節點中添加一個intent-filter標籤並使用以下的標籤
Android 如何解析 Intent Filter
當在startActivity 中傳入一個隱式的Intent時,決定啟動哪一個Activity的過程就叫做Intent解析,intent解析的目的是使用一下步驟來找出最匹配的Intent Filter
- Android 將已安裝包的可用Intent Filter 放到一個列表中
- 那些與解析Intent時相關聯的action或者category不匹配的Intent Filter將會從列表中移除
- 如果Intent Filter 包含了指定的action,則可認為action匹配了,如果沒有檢查到任何一個action和Intent制定的action相匹配,則認為action匹配失敗了
- 對於category 匹配來說,Intent Filter 必須包含待解析的Intent中的所有category,但可以包含 Intent 中所不包含的其他category,一個沒有制定category的Intent Filter只能和沒有任何category的Intent相匹配
Intent 的資料URI的每一個部分都和Intent Filter的data標籤進行比較,如果Intent Filter制定了scheme、host/authority、path或者是MIME類型,那麼這些值都要和Intent的URI比較,任意一個不匹配都會把Intent Filter從列表中移除,沒有制定資料值的Intent Filter將會和所有的Intent資料值匹配,這一點個category不一樣,需要注意
- MIME 類型是值要匹配的資料的資料類型,當匹配資料類型時,可以使用萬用字元來匹配子類型,如earthquake/*。如果Intent Filter 制定了一種資料類型,那麼它必須匹配該Intent,如果不指定資料類型,則它會匹配所有的Intent
- scheme 是URI的協議部分,如http: tel:
- hostname 或者是data authority 是URI位於scheme 和path之間的部分,如 developer.android.name ,hostname想要匹配,Intent Filter的scheme必須也要匹配
- 資料path是authority之後的內容,例如 /training。只有資料的scheme和hostname都匹配的時候,path才能匹配
當隱式啟動一個Activity的時候。如果這個進行解析出多個組件,那麼所有可能匹配的組件都會呈現給使用者。
傳遞責任
可以使用startNextMatchingActivity 方法將處理action的責任傳遞給下一個首選的Activity
Intent intent = getIntent();if(ifDuringBreak){startNextMatchingActivity(internt);}