鍍金池/ 教程/ Android/ Intents 和 Intent Filters
Dialog 顯示圖像
線程 Bezier 曲線
創(chuàng)建應用程序框架
引路蜂二維圖形庫簡介及顏色示例
Android 應用基本概念
Intents 和 Intent Filters
安裝開發(fā)環(huán)境
Option Menu 畫筆示例
自定義對話框 Transform
數據綁定 Data Binding
概述
Broadcast Receiver 短信觸發(fā)示例
發(fā)布應用
自定義 Adapter 顯示列表
RadioButton 多邊形及路徑繪制
訪問 Internet 繪製在線地圖
第一個應用 Hello World
Activities
Button 畫刷示例
使用資源 Resources
Context Menu 繪制幾何圖形
用戶界面設計
引路蜂二維圖形繪制實例功能定義

Intents 和 Intent Filters

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。

  1. Activity 通過方法 Context.startActivity() 和 Activity.startActivityForResult()來調用。以函數調用為參考startActivity() 相當于調用無返回值的函數,startActivityForResult()調用的Activity有返回值,可以通過Activity.setResult()來返回結果。
  2. Context.startService()用來初始化Service,Context.bindService()可以用來建立與目標Service之間的連接,如果Service沒有運行,則會啟動該Service。
  3. Broadcast Receiver是通過 Context.sendBroadcast(), Context.sendOrderedBroadcast(), 和Context.sendStickyBroadcast()來觸發(fā)的。大部分的Broadcast消息來自于Android操作系統,如電池狀態(tài),來電,短消息等。

和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。