Data 需要操作的數(shù)據(jù)的URI和它的MIME(多用途互聯(lián)網(wǎng)郵件擴(kuò)展,Multipurpose Internet Mail Extensions)類(lèi)型. 例如, 如果action為ACTION_EDIT, 那么Data將包含待編輯的數(shù)據(jù)URI. 如果action為ACTION_CALL, Data將為tel:電話號(hào)碼的URI. 如果action為ACTION_VIEW, 則Data為http:網(wǎng)絡(luò)地址的URI. 當(dāng)將一個(gè)intent和一個(gè)組件相匹配時(shí), 除了URI外數(shù)據(jù)類(lèi)型也很重要. 例如, 一個(gè)顯示圖片的程序不應(yīng)該用來(lái)處理聲音文件. 數(shù)據(jù)類(lèi)型常??梢詮腢RI推斷, 特別是content:URI, 它表示該數(shù)據(jù)屬于一個(gè)content provider. 但數(shù)據(jù)類(lèi)型也可以被intent對(duì)象顯示聲明. setData()方法設(shè)置URI, 而setType()方法指定MIME類(lèi)型, setDataAndType()設(shè)置數(shù)據(jù)URI和MIME類(lèi)型. 它們可以使用getData()和getType()來(lái)讀取. Category 一個(gè)字符串,包含了關(guān)于處理該intent的組件的種類(lèi)的信息. 一個(gè)intent對(duì)象可以有任意個(gè)category. intent類(lèi)定義了許多category常數(shù), 例如:
addCategory()方法為一個(gè)intent對(duì)象增加一個(gè)category, removeCategory刪除一個(gè)category, getCategories()獲取intent所有的category. Extras 為鍵值對(duì)形式的附加信息. 例如ACTION_TIMEZONE_CHANGED的intent有一個(gè)"time-zone"附加信息來(lái)指明新的時(shí)區(qū), 而ACTION_HEADSET_PLUG有一個(gè)"state"附加信息來(lái)指示耳機(jī)是被插入還是被拔出. intent對(duì)象有一系列put...()和set...()方法來(lái)設(shè)定和獲取附加信息. 這些方法和Bundle對(duì)象很像. 事實(shí)上附加信息可以使用putExtras()和getExtras()作為Bundle來(lái)讀和寫(xiě). Flags 各種標(biāo)志. 很多標(biāo)志指示android系統(tǒng)如何啟動(dòng)一個(gè)activity(例如該activity屬于哪個(gè)任務(wù))和啟動(dòng)后如何處理它(例如, 它是否屬于最近activity列表中). android系統(tǒng)和應(yīng)用程序使用intent對(duì)象來(lái)送出系統(tǒng)廣播和激活系統(tǒng)定義的組件. Intent Resolution Intent解析 intent有兩種: 顯式intent使用名字來(lái)指定目標(biāo)組件. 由于組件名稱(chēng)一般不會(huì)被其它開(kāi)發(fā)者所熟知, 這種intent一般用于應(yīng)用程序內(nèi)部消息-- 例如一個(gè)activity啟動(dòng)一個(gè)附屬的service或者另一個(gè)activity. 隱式intent不指定目標(biāo)的名稱(chēng). 一般用于啟動(dòng)其它應(yīng)用程序的組件. Android將顯式intent發(fā)送給指定的類(lèi). intent對(duì)象中名字唯一決定接受intent的對(duì)象.對(duì)于隱式intent, android系統(tǒng)必須找到最合適的組件來(lái)處理它. 它比較intent的內(nèi)容和intent filter. intent filter是組件的一個(gè)相關(guān)結(jié)構(gòu), 表示其接受intent的能力. android系統(tǒng)根據(jù)intent filter打開(kāi)可以接受intent的組件. 如果一個(gè)組件沒(méi)有intent filter, 那么它只能接受顯式intent. 如果有, 則能同時(shí)接受二者.當(dāng)一個(gè)intent和intent filter比較時(shí), 只考慮三個(gè)屬性: action, data, category.extra和flag在intent解析中沒(méi)有用. Intent filters activity, service和broadcast receiver可以有多個(gè)intent filter來(lái)告知系統(tǒng)它們能接受什么樣的隱式intent. intent filter的名字很形象: 它過(guò)濾掉不想接受的intent, 留下想接受的intent. 顯式intent無(wú)視intent filter.一個(gè)組件對(duì)能做的每件事有單獨(dú)的filter. 例如, 記事本程序的NoteEditor activity有兩個(gè)filter -- 一個(gè)啟動(dòng)并顯示一個(gè)特定的記錄給用戶(hù)查看或編輯, 另一個(gè)啟動(dòng)一個(gè)空的記錄給用戶(hù)編輯. Filters and security Filter和安全 一個(gè)intent filter不一定安全可靠. 一個(gè)應(yīng)用程序可以讓它的某個(gè)組件去接受隱式intent, 但是它沒(méi)法防止這個(gè)組件接受顯示intent. 其它的程序總是可以使用自定義的數(shù)據(jù)加上顯式的程序名稱(chēng)來(lái)調(diào)用該組件. 一個(gè)intent filter是IntentFilter類(lèi)的實(shí)例, 但是它一般不出現(xiàn)在代碼中,而是出現(xiàn)在android Manifest文件中, 以<intent-filter>的形式. (有一個(gè)例外是broadcast receiver的intent filter是使用 Context.registerReceiver()來(lái)動(dòng)態(tài)設(shè)定的, 其intent filter也是在代碼中創(chuàng)建的.) 一個(gè)filter有action, data, category等字段. 一個(gè)隱式intent為了能被某個(gè)intent filter接受, 必須通過(guò)3個(gè)測(cè)試. 一個(gè)intent為了被某個(gè)組件接受, 則必須通過(guò)它所有的intent filter中的一個(gè). Action 測(cè)試 java代碼:
|
|