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