Intent用於啓動Activity, Service, 以及BroadcastReceiver三種組件, 同時仍是組件之間通訊的重要媒介.
使用Intent啓動組件的優點
1, Intent爲組件的啓動提供了一致的編程模型. 不管想要啓動的組件是Activity, Service, 仍是BroadcastReceiver, 均可以使用Intent封裝啓動的意圖.
2, 在某些時候, 應用程序只是想啓動具備某種特徵的組件, 並不想和某個特定的組件耦合. 使用Intent能夠方便的達到這種高層次解耦的目的.
Intent的Component屬性
Intent對象的setComponent(ComponentName comp)方法用於設置Intent的Component屬性. ComponentName包含以下幾個構造器:
ComponentName(String pkg, String cls)
ComponentName(Context pkg, String cls)
ComponentName(Context pkg, Class<?> cls)
由以上的構造器可知, 建立一個ComponentName對象須要指定包名和類名--這就能夠惟一肯定一個組件類, 這樣應用程序便可根據給定的組件類去啓動特定的組件. 例如:
ComponentName comp = new ComponentName(FirstActivity.this, SecondActivity.class);
Intent intent = new Intent();
intent.setComponent(comp);
以上三句代碼建立了一個intent對象, 併爲其指定了Component屬性, 徹底等價於下面的代碼:
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
除了使用setComponent() 以外, 還可使用setClass(), setClassName()來顯式指定目標組件, 還能夠調用getComponent()方法得到Intent中封裝的ComponentName對象.html
當程序採用這種形式啓動組件時, 在Intent中明確的指定了待啓動的組件類, 此時的Intent屬於顯式intent, 顯式Intent應用場合比較狹窄, 多用於啓動本應用中的component, 由於這種方式須要提早獲知目標組件類的全限定名. 而隱式Intent則經過Intent中的action, category, data屬性指定目標組件須要知足的若干條件, 系統篩選出知足全部條件的component, 從中選擇最合適的component或者由用戶選擇一個component做爲目標組件啓動.
若是Intent中指定了ComponentName屬性, 則Intent的其餘屬性將被忽略.
Intent的Action屬性
action屬性是一個字符串, 表明某一種特定的動做. Intent類預約義了一些action常量, 開發者也能夠自定義action. 通常來講, 自定義的action應該以application的包名做爲前綴, 而後附加特定的大寫字符串, 例如"cn.xing.upload.action.UPLOAD_COMPLETE"就是一個命名良好的action.
Intent類的setAction()方法用於設定action, getAction()方法能夠獲取Intent中封裝的action.
如下是Intent類中預約義的部分action:
ACTION_CALL--目標組件爲activity, 表明撥號動做;
ACTION_EDIT--目標組件爲activity, 表明向用戶顯示數據以供其編輯的動做;
ACTION_MAIN--目標組件爲activity, 表示做爲task中的初始activity啓動;
ACTION_BATTERY_LOW--目標組件爲broadcastReceiver, 提醒手機電量太低;
ACTION_SCREEN_ON--目標組件爲broadcast, 表示開啓屏幕.
Intent的Category屬性
category屬性也是一個字符串, 用於指定一些目標組件須要知足的額外條件. Intent對象中能夠包含任意多個category屬性. Intent類也預約義了一些category常量, 開發者也能夠自定義category屬性.
Intent類的addCategory()方法爲Intent添加Category屬性, getCategories()方法用於獲取Intent中封裝的全部category.
如下是Intent類中預約義的部分category:
CATEGORY_HOME--表示目標activity必須是一個顯示home screen的activity;
CATEGORY_LAUNCHER--表示目標activity能夠做爲task棧中的初始activity, 常與ACTION_MAIN配合使用;
CATEGORY_GADGET--表示目標activity能夠被做爲另外一個activity的一部分嵌入.
Intent的Data屬性
data屬性指定所操做數據的URI. data常常與action配合使用, 若是action爲ACTION_EDIT, data的值應該指明被編輯文檔的URI; 若是
action爲ACTION_CALL, data的值應該是一個以"tel:"開頭並在其後附加號碼的URI; 若是action爲ACTION_VIEW, data的值應該是一個以"http: "開頭並在其後附加網址的URI...
Intent類的setData()方法用於設置data屬性, setType()方法用於設置data的MIME類型, setDataAndType()方法能夠同時設定二者. 能夠經過getData()方法獲取data屬性的值, 經過getType()方法獲取data的MIME類型.
Intent的Extra屬性
經過Intent啓動一個component時, 常常須要攜帶一些額外的數據過去. 攜帶數據須要調用Intent的putExtra()方法, 該方法存在多個重載方法, 可用於攜帶基本數據類型及其數組, String類型及其數組, Serializable類型及其數組, Parcelable類型及其數組, Bundle類型等. Serializable和Parcelable類型表明一個可序列化的對象
, Bundle與Map相似,可用於存儲鍵值對.
Intent的Flag屬性
flag屬性是一個int值, 用於通知android系統如何啓動目標activity, 或者啓動目標activity以後應該採起怎樣的後續操做. 全部的flag都在Intent類中定義, 部分經常使用flag以下:
FLAG_ACTIVITY_NEW_TASK--通知系統將目標activity做爲一個新task的初始activity;
FLAG_ACTIVITY_NO_HISTORY--通知系統不要將目標activity放入歷史棧中;
FLAG_FROM_BACKGROUND--通知系統這個Intent來源於後臺操做, 而非用戶的直接選擇...
IntentFilter類
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>
IntentFilter與隱式Intent
android系統處理隱式Intent時, 會比較Intent和IntentFilter的action, data, category屬性, 若是以上3個屬性全都相符的話, 則IntentFilter所屬的component就能夠做爲目標組件的候選(存在多個符合條件的component時).
1. 測試action屬性. intent最多隻能定義1個action, 而filter能夠定義1個或多個action.
經過action測試的條件爲: filter定義了intent的action. 例如intent的action爲"android.intent.action.MAIN", 則定義了"android.intent.action.MAIN"這個action的filter都能經過action測試(固然, filter還能夠包含更多額外的action).
若是filter沒有定義action, 則這個filter將阻塞全部intent. 若是intent沒有定義action, 那麼只要filter定義了action就能夠經過action測試.
2. 測試category屬性. intent能夠任意多個category, filter也能夠任意個category. 經過category測試的條件爲: filter定義了intent的全部category. 例如intent定義了"android.intent.category.DEFAULT"和"cn.xing.intent.category.UPLOAD"這2個category, 則定義了以上2個category屬性的filter才能經過測試(固然, filter還能夠包含更多額外的category).
根據上面的規則, 若是一個intent沒有定義category, 則全部filter均可以經過category測試. 可是有一種例外: 以startActivity(intent)方式啓動一個activity時, 系統爲會intent增長一個值爲"android.intent.category.DEFAULT"的category, 這就意味着每個指望經過category測試的activity, 都要在其filter中定義"android.intent.category.DEFAULT"(除了做爲程序入口的activity).
3. 測試data屬性. intent最多隻能定義1個data, filter則能夠定義多個data.
經過data測試的條件爲:
a. 若是intent沒有指定data和data type, 則只有沒有定義data和date type的filter才能經過測試;
b. 若是intent定義了data沒有定義data type, 則只有定義了相同data且沒有定義date type的filter才能經過測試;
c. 若是intent沒有定義data卻定義了data type, 則只有未定義data且定義了相同的data type的filter才能經過測試;
d. 若是intent既定義了data也定義了data type, 則只有定義了相同的data和data type的filter才能經過測試.
data屬性是一個URI, URI中包含scheme, host, post和path, 典型的URI爲:
scheme://host:port/path
scheme, host, post和path都是可選的. 比較2個data時, 只比較filter中包含的部分. 好比filter的一個data只是指定了scheme部分, 則測試時只是比較data的scheme部分, 只要二者的scheme部分相同, 就視爲"相同的data".android
http://www.cnblogs.com/liushengjie/archive/2012/08/30/2663066.html編程