Android Intent 基本使用及對象構成


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM