一、Intent簡介
Android程式的3個核心元件——Activity、services、廣播接收器——是通過intent傳遞消息的。intent消息對于運作時綁定不同的元件是很友善的,這些元件可以是同一個程式也可以是不同的。一個intent對象,是一個被動的資料結構,它儲存了一個操作的抽象描述——或通常是一個廣播的執行個體,一些發生的事情的描述,一個通知。傳遞intent到不同元件的機制是互不相同的。
- intent對象是傳遞給Context.startActivity() 或Activity.startActivityForResult() 以啟動Activity或是讓一個存在的Activity做些事情。(也可以傳遞給Activity.setResult()來傳回Activity的資訊,這個函數叫startActivityForResult()。)
- intent對象傳遞給函數來初始化一個service或是分發一個新的指令給一個正在進行的service。同樣,intent傳遞給來建立一個在調用元件和目标service間的聯系。如果一個service沒有運作,它可以開始它。
- intent可以傳遞給任何廣播函數(如:Context.sendBroadcast()、Context.sendOrderedBroadcast()、 Context.sendStickyBroadcast()),intent被分派給所有感興趣的廣播接收者。很多廣播源在系統核心裡。
二、Intent包含内容
1.Action 需要執行的動作的名字——或在廣播intent裡,發生動作并且被報告。intent類定義動作的常量,如下
Constant | Target component | Action |
---|---|---|
| activity | Initiate a phone call. |
| activity | Display data for the user to edit. |
| activity | Start up as the initial activity of a task, with no data input and no returned output. |
| activity | Synchronize data on a server with data on the mobile device. |
| broadcast receiver | A warning that the battery is low. |
| broadcast receiver | A headset has been plugged into the device, or unplugged from it. |
| broadcast receiver | The screen has been turned on. |
| broadcast receiver | The setting for the time zone has changed. |
intent裡的動作是通過 setAction()函數設定,通過getAction()函數讀取。 2.Data 資料的URI和MIME類型的資料。不同的動作和不同的資料配對。例如:如果動作域是ACTION_EDIT,資料域需要包含文檔的URI以便顯示,編輯。如果動作是ACTION_CALL,資料域需要是一個帶撥号的号碼的tel: URI。相同的,如果動作是ACTION_VIEW資料域是http: URI,接收Activity需要調用并下載下傳、顯示URI引用的任何資料。 3.Extra 附加鍵值對資訊,這個鍵值會分派給處理intent的元件。通過一些列的put.. get..方法來處理 4.Flag用于通知android系統如何啟動目标activity, 或者啟動目标activity之後應該采取怎樣的後續操作. 所有的flag都在Intent類中定義, 部分常用flag如下:
FLAG_ACTIVITY_NEW_TASK--通知系統将目标activity作為一個新task的初始activity;
FLAG_ACTIVITY_NO_HISTORY--通知系統不要将目标activity放入曆史棧中;
FLAG_FROM_BACKGROUND--通知系統這個Intent來源于背景操作, 而非使用者的直接選擇...
三、Intent filter
IntentFilter類表示Intent過濾器, 大部分情況下, 每一個component都會定義一個或多個IntentFilter, 用于表明其可處理的Intent.
一般來說, component的IntentFilter應該在AndroidManifest.xml檔案中定義.
定義的方法: 在<activity>, <receiver>, <service>元素中增加一個或多個<intent-filter>子元素. 如:
<!-- 聲明作為程式入口的Activity -->
<activity android:name=".FirstActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
注意:android系統處理隐式Intent時, 會比較Intent和IntentFilter的action, data, category屬性, 如果以上3個屬性全都相符的話, 則IntentFilter所屬的component就可以作為目标元件的候選(存在多個符合條件的component時). 更多内容可以參考這裡點選打開連結
四、其他
參考文獻:官方文檔 http://www.cnblogs.com/liushengjie/archive/2012/08/30/2663066.html