Intent
Intent基本使用
Intent可以理解為不同組件通信的媒介或者信使。
Intent可以啟動一個Activity,也可以啟動一個Service,還可以發起一個廣播Broadcast。
具體方法如下表:
組件名稱 |
方法名稱 |
Activity |
startActivity() startActivityForResult() |
Service |
startService() bindService() |
Broadcasts |
sendBroadcast() sendOrderedBroadcast() sendStickyBroadcast() |
1.啟動Activity:
向Context.startActivity() 或Activity.startActivityForResult()方法傳遞一個Intent對象,可以啟動一個activity,或使得一個已經存在的activity去做一些新的事情。
(也可以向 Activity.setResult() 去傳遞這個Intent對象,返回調用了startActivityForResult()
的activity的一些信息。)
2.啟動Service:
向 Context.startService() 方法傳遞Intent對象可以初始化一個service或者向一個已經存在的service傳遞新的指令。
類似的,向Context.bindService() 方法傳遞Intent對象可以在調用所在的組件和目標service之間建立一種連接。如果這個service並沒有開始運行,則它可以初始化這個service。
3.發起廣播Broadcast
可以向下面的廣播方法傳遞Intent對象來發起廣播:
Context.sendBroadcast(),Context.sendOrderedBroadcast(), 或 Context.sendStickyBroadcast()。系統會找到相應的廣播接收者對此進行響應。
Intent在尋找目標組件時有兩種方法:
第一種,顯式調用,通過Component name直接指定;
第二種,隱式調用,沒有明確指定目標組件的名稱,那么就要通過一定的條件過濾篩選。
啟動activity、service和broadcast的消息系統是沒有任何重合的,即,一個要啟動activity的Intent對象是絕對不會啟動一個service的。
Intent對象構成
Intent對象由以下六個部分組成:
Component name
Action
Data
Category
Extras
Flags
Component name
Component name即組件名稱,是要處理這個Intent對象的組件名稱。
組件名稱對象由ComponentName類來封裝,組件名稱包含包名稱和類名稱,被聲明在AndroidManifest.xml文件中。
組件名稱通過 setComponent(),setClass(),setClassName()設置,通過getComponent()獲取。
需要注意的是Component name是一個可選項,如果被設置,那么Intent對象就顯式指定了要轉向的組件,如果沒有被設置,則Intent對象需要根據其他信息進行篩選查找。
Action
Action是指Intent要完成的動作,是一個字符串常量。
在Intent類里面定義了很多Action常量,其中有:
Intent類中有很多預定義的常量,為了一些通常的動作;還有一些定義在Android API的其他地方。
也可以自己定義Action常量,自定義的常量需要加上你的應用的包名作為前綴。
Action在很大程度上決定了Intent的其他部分是如何構造的,尤其是 data 和 extras域。(就好像函數名會決定着參數值和返回值一樣。)所以Action的名字應該盡可能具體,並且它們應該和Intent中的其他域緊密結合。
使用 setAction() 和 getAction()來設置和讀取Action屬性。
Data
Data屬性是執行動作的URI和MIME類型,不同的動作有不同的數據規格。
比如,Action是ACTION_EDIT時,數據域將是文檔的URI;Action是ACTION_CALL時,數據域是 tel: URI ,帶有要撥打的電話號碼;如果Action是 ACTION_VIEW,則數據域是http: URI。
當匹配intent和能夠處理intent所帶的數據的組件時,知道數據類型(MIME類型)是很重要的。比如,一個展示圖像的組件不應該被叫去播放一個音頻。
很多情況下,從URI可以看出數據類型,比如content: URIs,表示數據是在設備上,但是是由content provider控制。
數據類型也可以顯式指定,比如setData()方法指定數據為URI,setType() 指定為MIME type,setDataAndType() 指定它既為URI又為MIME type。讀取的時候URI用getData(),MIME type用getType()。
Category
Category是一個字符串,提供了額外的信息,有關於能夠處理這個Intent對象的組件種類。
一個Intent對象中可以包含任意數量的category描述信息。
Intent類中也定義了一些Category常量:
與category相應的方法有添加addCategory()、移除removeCategory() 和獲取所有category getCategories() 。
Extras
傳遞給Intent的額外數據,以Bundle的形式定義,就是一些鍵值對。就好像一些動作和特定的數據URI對應,一些動作和特定的extras對應。
比如ACTION_TIMEZONE_CHANGED intent對象有一個 "time-zone
"的extra來確認新的時區;
ACTION_HEADSET_PLUG
有一個"state
" extra表示耳機是否插入,還有一個 "name
" extra關於耳機類型;
如果你要設計一個SHOW_COLOR動作,那么extra中應該包含顏色值。
Intent對象有一系列的putXXX()函數用於放入各種數據類型,相應的也有一系列的getXXX()函數用於讀取數據。
實際上,數據可以被作為一個Bundle對象被使用,利用 putExtras() 和 getExtras() 方法。
Flags
各種類型的Flag。很多是用來指定Android系統如何啟動activity,還有啟動了activity后如何對待它。所有這些都定義在Intent類中。
參考資料
官方文檔:
http://developer.android.com/reference/android/content/Intent.html
http://developer.android.com/guide/components/intents-filters.html
博客:
http://www.cnblogs.com/feisky/archive/2010/01/16/1649081.html?t=1354802353061