Android 應用中的三個核心組件:Activities,Services 和 broadcast receivers 都是通過稱為“Intent”的消息來激活的。Android 應用一個特點是“低耦合”,各個 Activities,Services 和broadcast receivers 相當獨立,可以看成是一個個“迷你應用”,而 Intent 是這些“迷你應用”的粘合劑,Intent 不但可以用于同一個 Application 之間 Activities,Services 和 broadcast receivers 的交互,也可以用于不同 Application 之間 Activities,Services 和 broadcast receivers 的交互。 Intent 本身為一個數據載體,可以描述想要執(zhí)行的操作以及用于這個操作的數據和其它屬性。用個容易理解的概念,在訪問網站時,我們需要提供網站的URL,有時還需要通過 URL 參數,在 Android 世界里,Intent 的功能類似于 URL,Android 操作系統根據 Intent 來觸發(fā)對于的Activitives,Services 或是 Broadcast Receivers。
Android 應用中的三個核心組件:Activities,Services 和 broadcast receivers 都是通過Intent 來觸發(fā)的,當它們觸發(fā)的機制各不相同,而且不會有重疊,也就是說發(fā)給 Activity 的 Intent 不會激活 Service 或是 broadcast receivers,發(fā)給 broadcast receivers 的 Intent 也不會觸發(fā) Activity 和 Service。
和URL不太一樣的是,URL 和網站一般是一一對應的,而一個 Intent 可以用來觸發(fā)某個指定的Activity,Service 或是 Broadcast Receiver,或是觸發(fā)多個滿足 Intent 條件的 Activities,Services 或是 Broadcast Receivers。
下面來看看 Android OS 如何根據 Intent 來找到滿足觸發(fā)條件的 Activity,Service 或是Broadcast Receiver. 借用 SQL 數據庫的概念可以更好的理解。
SELECT (Activitives|Services|Broadcast Receivers) AS Target
FROM (List in AndroidManifest.xml)
WHERE Intent Meet Target’s (Intent Filter)
意思就是從 AndroidManifest.xml 中定義的 Activities,Services 和 Broadcast Receiver 列表中查找符合 Intent 條件的 Activities,Services,或是 Broadcast Receivers。所有能活被激活的 Activity,Service 和 Broadcast Receiver 都必須在 AndroidManifest.xml 有定義,否則 Android OS 無法查詢到該目標,相當于數據庫中無記錄,即使你在代碼中定義了該Activity,Service 或 Broadcast Receiver。
Intent
Intent 本身為一個數據載體,可以描述想要執(zhí)行的操作以及用于這個操作的數據和其它屬性。它主要包含下列信息:
Component name:可以處理該 Intent 的組件名稱,組件名稱指定義 Activity,Service 的包和類的全名稱。比如類名為 com.pstreets.gisengine.AndroidGISEngineTutorial,包名為 com.pstreets.gisengine。 組件名稱為可選項,如果指定了,意味明確指定用來響應該 Intent 的 Activity,Service。
Action: 列出需要執(zhí)行的操作名稱?;蛘咴?Broadcast Intents 的情況下給出發(fā)生的事件名稱。
Constant | Target component | Action |
---|---|---|
ACTION_CALL | activity | 開始打電話. |
ACTION_EDIT | activity | 顯示編輯對話框. |
ACTION_MAIN | activity | 作為一個任務(應用)的起始 Activity,對于可以從 Android 應用列表的應用來說,都需要在 AndroidManifest.xml 中設置 ACTION_MAIN 的 Intent-Filter 屬性。 |
ACTION_SYNC | activity | 同步數據. |
ACTION_BATTERY_LOW | broadcast receiver | 電池電量低告警. |
ACTION_HEADSET_PLUG | broadcast receiver | 耳機插入或拔出. |
ACTION_SCREEN_ON | broadcast receiver | 屏幕打開或關閉. |
ACTION_TIMEZONE_CHANGED | broadcast receiver | 時區(qū)變動. |
Data:定義不數據的 URL 以及數據的 MIME 類型。不同的 Action 能夠處理的 Data 類型也不一樣,比如 ACTION_CALL,它處理的數據格式為 tel: URI,URI 為電話號碼。 Category: 定義了可以響應 Intent 的附加信息,一個 Intent 可以指定多個 Category 類型。和 Action 類似,Android 預定義了一些 Category 類型:
Constant | Meaning |
---|---|
CATEGORY_BROWSABLE | 表示目標 Activity 可以使用瀏覽器安全顯示指定連接,比如說一個圖片或是 Email 消息. |
CATEGORY_GADGET | 表示該 Activity 可以當作一個 Gadget 嵌入到其它可以放置 Gadget 的 Activity 中。 |
CATEGORY_HOME | 表示還 Activity 是 Home Screen,可以設置這個屬性來替換 Android 自帶的 Home Screen。 |
CATEGORY_LAUNCHER | 該 Activity 可以顯示在 Android 程序管理器中。一般應用的主 Activity 都會在 AndroidManifest.xml 定義該屬性。 |
Extra: 附加 Key-Value 列表,可以向目標 Activity 傳送附加參數??梢岳斫獬珊瘮嫡{用時的參數。
Flags:指出 Android 啟動目標 Activity 時的一些選項(比如目標 Activity 隸屬于那個應用等)。
除非是 Intent 明確指定目標(Explicitly)Activity 的類和包名稱,這是 Activity 無需在 AndroidManifest.xml 定義 intent-filter,其它情況也叫隱含(Implicit)方式啟動目標 Activity,在這種情況下 Android 操作系統查找目標 Activity,Service 或是 Broadcast Receiver 時主要根據 Intent 的 Action,Data 和 Category 屬性來匹配定義在 AndroidManifest.xml 中 Activity,Service 或是 Broadcast Receiver 的 Intent Filters。
Intent Filters
Android 中沒個有效的 Activity,Service,Broadcast Receiver 都必須在 AndroidManifest.xml 有對應的定義。除非只使用明確調用發(fā)生來啟動目標 Activity,每個 Activity 都需要定義一個 intent-filter。下面是是明確指定目標Activity 的示例代碼:
Intent intent=new Intent(SplashActivity.this,GNavigator.class);
startActivity(intent);
而更一般的情況,Activity 在 AndroidManifest.xml 具有如下定義:
<activity android:name=”.AndroidGISEngineTutorial”
android:label=”@string/app_name”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
<action android:name=”com.example.project.SHOW_CURRENT” />
<action android:name=”com.example.project.SHOW_RECENT” />
<action android:name=”com.example.project.SHOW_PENDING” />
….
<category android:name=”android.intent.category.DEFAULT” />
<category android:name=”android.intent.category.BROWSABLE” />
…
<data android:mimeType=”video/mpeg” android:scheme=”http” . . . />
<data android:mimeType=”audio/mpeg” android:scheme=”http” . . . />
….
</intent-filter>
</activity>
Activity 的 intent-filter 可以包含 action,category,data 子元素,給出了該 Activity 能夠處理的 Intent 的Action,Category 和數據類型。Android 操作系統就是根據 Activity 的 intent-filter 來匹配 Intent,從而觸發(fā)目標Activity,或是 Service,Broadcast Receiver。
最常見的一個 Intent Filter 組合如下:
<intent-filter . . . >
<action android:name=”code android.intent.action.MAIN” />
<category android:name=”code android.intent.category.LAUNCHER” />
</intent-filter>
表示用戶可以從 Android 設備的應用程序管理器啟動該 Activity,這個 Activity 為應用的主 Activity,主 Activity可以再使用 Intent 觸發(fā)或是啟動其它 Activity。