3.1 Android组件intent filter
3.1.0 Intent filter基本概念
前面章節我們說到了Intent,Intent對象中除了ComponentName可以直接指定目標組件外,其它的屬性都無法直接指定目標組件。當然我們這里不指使用Activity的內部方法如startActivity或者intent的setClass方法可以指定目標組件。單獨的屬性是無法確定目標組件的。那Android怎么辦呢?Android如何根據一個intent對象找到目標組件呢?Intent在系統中,從概念上分為顯示intent和隱式intent。其中顯示intent,就是前面所說的通過指定intent的目標組件名稱來實現,這種intent需要知道目標組件名稱。另一種所謂隱式intent,這種intent用intent filter進行處理。Android對每個組件設置intent filter來訂閱intent 消息屬性。這個有點類似于Linux IPC消息,發送者將消息發到Kernel,然后由組件通過intent filter從Kernel上取得消息。
顯示intent和隱式intent在具體應用中,通常是針對不同的場景來進行應用,如顯示intent通常是在一個應用的內部組件之間,這樣可以知道具體目標組件的類名。而隱式intent就不一定了,通常可以打開如電話、短信等基礎Android應用。前面我們說intent filter是針對隱式intent,為了組件能夠匹配到具體合適的intent。Android內部的intent解析機制是通過查找已注冊在AndroidManifest.xml中的所有IntentFilter及其定義的Intent,最終找到匹配的intent。在這個解析過程中,Android通過intent的Action、Category和Data這三個屬性來進行判斷,并且是都滿足的情況才可啟動這個組件。如果一個filter的Action可以,但是category不對,也不行的。
如上圖所示,對intent filter來說,進行ACTION, DATA,CATEGORY的分析比較是一個intent filter的基本機制。下面分述如下:
【1】Action
如果一個組件想要接收某個intent,那么它的intent filter中action元素必有與這個intent相同的action(在定義action的前提下)。Intentfilter中定義的action,不再像前面使用縮寫的常量,需要使用android.intent.action.EDIT之類。創建一個Intent filter非常簡單,只需要在Activity 的子元素中定義,如下圖所示:
接著定義Activity和Intent.將intent的Action設為其中一個Action.
【2】Category
同前面Action一樣,一個組件想要響應一個intent就必須與這個intent具有相同的Category,但是通常有些intent對DEFAULT Category 都不設置,默認就是這個Category,但是對Intent filter那是不可以的,一定要有DEFAULT Category設置。如前面所述,Android 2.2以后,對intent filter要求更加嚴格,也就是說,前面的Action一定要存在。否則無法查找到相應的組件。如下所示定義一個Intent的一個自定義ACTION和一個CATEGORY。
接著再定義一個intent filter用來匹配對應用的intent.
?
【3】Data
Data屬性是Android要訪問的數據,和前面兩個屬性一樣,在intent filter中也可以聲明Data屬性。聲明Data屬性需要同時指定訪問數據的URI和MIME類型。在Intent filter中Data 屬性分為四個獨立的屬性進行設置,共同組成一個URI:scheme://host:port/path
從這里可以看出intent filter在匹配data時候的一些規則的不同,它是以intent filter為最大集,比喻說intent filter定義了http://www.sina.com.cn,但實際上它是可以匹配http://www.sina.com.cn/boke等子路徑的。同樣對MIME類型,更是如此,它可以支持通配符如"text/*”或者“audio/*”等。Data屬性匹配規則如下:
【1】如果intent 對象中沒有包含data,<intent-filter>列表中也沒有包含DATA,這種情況下一般通過ACTION來匹配。
【2】如果Intent 對象包含URI但是沒包括類型,并且類型不能從URI中自動識別,那么<intent-filter>列表中也只能包含URI,才能匹配
【3】相反,如果Intent對象只包含類型,不包含URI,那么<intent-filter>也只能含類型,不含 URI
【4】如果Intent 對象中既包含URI又包括Type,那么在<intent-filter>中也必須二者都包含。
創建一個Intent時設置data 屬性,如下所示,使用Uri類進行parse.
在<intent-filter>中使用data屬性進行匹配。
3.1.1 Intent filter 類及packageManager
前面我們著重談到的都是通過在xml文件中定義intent filter,實際上intent filter也是一個類,如下圖所示。它可以在receiver中直接注冊使用。
從類中,你可以使用add方法將相關屬性填入其中。
轉載于:https://blog.51cto.com/acreep/677525
總結
以上是生活随笔為你收集整理的3.1 Android组件intent filter的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 调类调值调型的区别(调类)
- 下一篇: 建立隐藏的O盘