標籤:
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
轉載自:http://www.cnblogs.com/mengdd/archive/2013/03/18/2965839.html
Android Intent 基本使用及對象構成