Data
需要操作的數據的URI和它的MIME(多用途互聯網郵件擴展,Multipurpose Internet Mail Extensions)類型. 例如, 如果action為ACTION_EDIT, 那么Data將包含待編輯的數據URI. 如果action為ACTION_CALL, Data將為tel:電話號碼的URI. 如果action為ACTION_VIEW, 則Data為http:網絡地址的URI.
當將一個intent和一個組件相匹配時, 除了URI外數據類型也很重要. 例如, 一個顯示圖片的程序不應該用來處理聲音文件.
數據類型常常可以從URI推斷, 特別是content:URI, 它表示該數據屬于一個content provider. 但數據類型也可以被intent對象顯示聲明. setData()方法設置URI, 而setType()方法指定MIME類型, setDataAndType()設置數據URI和MIME類型. 它們可以使用getData()和getType()來讀取.
Category
一個字符串,包含了關于處理該intent的組件的種類的信息. 一個intent對象可以有任意個category. intent類定義了許多category常數, 例如:
常量 | 含義 |
CATEGORY_BROWSABLE | 目標activity可以使用瀏覽器來顯示-例如圖片或電子郵件消息. |
CATEGORY_GADGET | 該activity可以被包含在另外一個裝載小工具的activity中. |
CATEGORY_HOME | 該activity顯示主屏幕,也就是用戶按下Home鍵看到的界面. |
CATEGORY_LAUNCHER | 該activity可以作為一個任務的第一個activity,并且列在應用程序啟動器中. |
CATEGORY_PREFERENCE | 該activity是一個選項面板. |
addCategory()方法為一個intent對象增加一個category, removeCategory刪除一個category, getCategories()獲取intent所有的category.
Extras 為鍵值對形式的附加信息. 例如ACTION_TIMEZONE_CHANGED的intent有一個"time-zone"附加信息來指明新的時區, 而ACTION_HEADSET_PLUG有一個"state"附加信息來指示耳機是被插入還是被拔出.
intent對象有一系列put...()和set...()方法來設定和獲取附加信息. 這些方法和Bundle對象很像. 事實上附加信息可以使用putExtras()和getExtras()作為Bundle來讀和寫.
Flags 各種標志. 很多標志指示android系統如何啟動一個activity(例如該activity屬于哪個任務)和啟動后如何處理它(例如, 它是否屬于最近activity列表中).
android系統和應用程序使用intent對象來送出系統廣播和激活系統定義的組件.
Intent Resolution Intent解析
intent有兩種: 顯式intent使用名字來指定目標組件. 由于組件名稱一般不會被其它開發者所熟知, 這種intent一般用于應用程序內部消息-- 例如一個activity啟動一個附屬的service或者另一個activity.
隱式intent不指定目標的名稱. 一般用于啟動其它應用程序的組件.
Android將顯式intent發送給指定的類. intent對象中名字唯一決定接受intent的對象.對于隱式intent, android系統必須找到最合適的組件來處理它. 它比較intent的內容和intent filter. intent filter是組件的一個相關結構, 表示其接受intent的能力. android系統根據intent filter打開可以接受intent的組件. 如果一個組件沒有intent filter, 那么它只能接受顯式intent. 如果有, 則能同時接受二者.當一個intent和intent filter比較時, 只考慮三個屬性: action, data, category.extra和flag在intent解析中沒有用.
Intent filters activity, service和broadcast receiver可以有多個intent filter來告知系統它們能接受什么樣的隱式intent. intent filter的名字很形象: 它過濾掉不想接受的intent, 留下想接受的intent. 顯式intent無視intent filter.一個組件對能做的每件事有單獨的filter. 例如, 記事本程序的NoteEditor activity有兩個filter -- 一個啟動并顯示一個特定的記錄給用戶查看或編輯, 另一個啟動一個空的記錄給用戶編輯.
Filters and security Filter和安全 一個intent filter不一定安全可靠. 一個應用程序可以讓它的某個組件去接受隱式intent, 但是它沒法防止這個組件接受顯示intent. 其它的程序總是可以使用自定義的數據加上顯式的程序名稱來調用該組件.
一個intent filter是IntentFilter類的實例, 但是它一般不出現在代碼中,而是出現在android Manifest文件中, 以<intent-filter>的形式. (有一個例外是broadcast receiver的intent filter是使用 Context.registerReceiver()來動態設定的, 其intent filter也是在代碼中創建的.)
一個filter有action, data, category等字段. 一個隱式intent為了能被某個intent filter接受, 必須通過3個測試. 一個intent為了被某個組件接受, 則必須通過它所有的intent filter中的一個.
Action 測試java代碼:- <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>
復制代碼