intents 和 intent過濾器(一)

Android應用程序有三個核心組件---Activity、Service、Broadcast Receiver,Broadcast receiver是通過叫做Intent的消息來激活的。Intent消息是同一個應用程序或不同應用程序運行後,組件間進行綁定的一種能力。Intent對象本身是一個持有要執行操作的抽象描述的無源數據結構,或者在廣播的情況下,經常用它來描述一些已經發生或正在發生的事情。給每種類型組件發送Intent對象都有其獨立的機制:

1.  爲了做某些新的操作,把一個Intent對象傳遞給Context.startActivity()或Activity.startActivityForResult()方法來啓動一個新的Activity或者獲取一個既存的Activity。調用startActivityForResult()方法啓動的那個Activity也能夠把Intent對象傳遞給Activity.setResult()方法來返回響應的信息。

2.  把一個Intent對象傳遞給Context.startService()方法來初始化一個服務或給一個正在運行的服務發送新的指令。類似地,也能把Intent對象傳遞給Context.bindService()方法,在調用組件和目標服務之間建立一個連接,如果服務還沒有運行可以選擇啓動。

3.  傳遞給廣播方法(如,Context.sendBroadcast()、Context.sendOrderedBroadcast()、或Context.sendStickyBroadcast()方法)的任何Intent對象都被髮送給所有的感興趣的廣播接收器。廣播的許多類型源於系統代碼。

在每種情況下,Android系統都會查找對應的Activity、Service或Broadcast Receiver的設置來響應這個Intent對象,如果需要也會實例化這些組件。在這些消息系統內部沒有消息重疊:廣播的Intent對象僅發送給Broadcast Receiver組件,不會發送給Activity或Service組件。傳遞給startActivity()方法的Intent對象僅發送給一個Activity,不會發送給一個Service或Broadcast Receiver組件,等等。

本文檔開始介紹Intent對象,然後介紹Android使用的把Intent對象映射給組件的規則---Android系統是如何解析那個組件應該接收對應的Intent消息。對於沒有明確命名目標組件的Intent對象,這個過程涉及用與潛在的目標關聯Intent過濾器來檢測Intent對象。

Intent 對象

一個Intent對象就是一個信息包。它包含了接收這個Intent對象的組件感興趣的信息(如要執行的動作和動作相關的數據)和Android系統感興趣的信息(如處理這個Intent對象的組件的分類和有關如何啓動目標Activity的指令),主要包含以下信息:

組件名

指的是能夠處理Intent對象的組件的名字。這個字段是一個ComponentName對象---它是目標組件的完全類名(如:com.example.project.app.FreneticActivity)和組件所在的應用程序的清單文件中設置的包名(如:com.example.project)的組合。組件名的包部分和清單文件中設置的包名不一定一致。

組件名是可選的,如果設置了組件名,Intent對象就會被髮送給這個指定類的實例。如果沒有設置,Android系統使用Intent對象中的其他信息來定位合適的目標。

組件名是通過setComponent()、setClass()或setClassName()方法來設置,並且通過getComponent()方法來讀取。

動作(Action)

指的是一個要執行的動作的命名字符串,在廣播Intent對象的情況下,指的是已經發生和正在報告的動作。Intent類定義很多動作常量,詳見下表:

常量

目標組件

動作

ACTION_CALL

Activity

發起電話呼叫

ACTION_EDIT

Activity

爲用戶顯示要編輯的數據

ACTION_MAIN

Activity

作爲一個任務的初始Activity啓動,沒有數據輸入和返回輸出。

ACTION_SYNC

Activity

用移動設備上的數據同步服務上的數據。

ACTION_BATTERY_LOW

Broadcast Receiver

低電量的一個警告

ACTION_HEADSET_PLUG

Broadcast Receiver

耳麥已經被插入設備,或者從設備上拔出。

ACTION_SCREEN_ON

Broadcast Receiver

顯示屏已經被打開

ACTION_TIMEZONE_CHANED

Broadcast Receiver

時區相關的設置已經被改變

對於一般性動作的預定義常量列表,請看Intent類說明。在Android API的其他地方還定義了一些其他的動作。你也可以在自己的應用程序中給Activity組件定義自己的動作字符串。你創建這些動作應該包含應用程序的包名作爲動作前綴---例如:com.example.project.SHOW_COLOR.

動作在很大程度上決定了Intent類的結構---特別是data和extras字段---如一個方法名決定了一組參數和一個返回值。由於這個原因,儘可能的指定使用動作的名字是個好主意,並且要把它們與Intent的其他字段緊密的捆綁在一起。換句話說,就是要給你的組件能夠處理的Intent對象定義一個完整的協議,而不是定義一個獨立的動作。

Intent對象中的動作是由setAction()方法設定的,並且有getAction()方法讀取的。

數據(Data)

指的是動作相關的數據的資源標識和數據的MIME類型。不同的動作要跟不同的數據規範類型配合使用。如果動作字段是ACTION_EDIT,那麼數據字段應該包含爲編輯而顯示的數據的資源標識(URI)。如果動作時ACTION_CALL,那麼數據字段就應該是tel:帶有呼叫號碼的URI。類似地,如果動作時ACTION_VIEW,並且數據字段是http:URI。那麼接收Activity就應該下載並顯示URI所指向的數據。

在把一個Intent對象分配給一個有處理數據能力的組件時,瞭解附件在URI中的數據類型是至關重要。例如,能夠顯示圖片的組件不應該被調用來播放音頻文件。

很多情況下,從URI中能夠推斷出數據類型---特別是content:URIs,它指明瞭設備上數據的位置和控制數據的內容提供器。但是數據類型也能夠在Intent對象中明確的設定。setData()方法只能給URI指定數據,setType()方法只能給數據指定MIME類型,setDataAndType()方法同時指定URI的數據和數據的MIME類型。通過getData()方法讀取數據,getType()方法獲取數據類型。

分類(Category)

指的是包含能夠處理這個Intent對象的組件類型的相關信息的字符串。任何類別的分類描述都能夠被放在Intent對象中。跟action的動作一樣,Intent類也定義幾個分類常量,如下表:

常量

含義

CATEGORY_BROWSABLE

目標Activity能夠安全的調用瀏覽器來顯示鏈接所指向的數據---如,一張圖片或一封電子郵件消息。

CATEGORY_GADGET

Activity能夠被嵌入到持有小部件的另一個Activity中

CATEGORY_HOME

Activity顯示在主屏幕上,在設備打開時用戶看到的第一個屏幕或Home按鈕被按下時,用戶看到的屏幕。

CATEGORY_LAUNCHER

Activity能夠作爲任務的初始Activity,並且被列在應用程序啓動器的頂層。

CATEGORY_PREFERENCER

目標Activity是一個首選面板。

完整的分類列表請看Intent類的說明。

addCategory()方法把一個分類放到一個Intent對象中,removeCategory()方法刪除先前添加的分類,getCategories()方法獲取當前Intent對象中的所有分類設置。

附加信息(Extras)

它是以Key-value對的形式發送給處理這個Intent對象的組件的附加信息。就像某些數據URIs要跟動作配對一樣,某些特殊的附加信息也需要配對。如,一個ACTION_TIMEZONE_CHANGED類型的Intent對象有一個指定新時區的time-zone附加信息,ACTION_HEADSET_PLUG類型的Intent對象有一個指示耳麥當前是插入還拔出狀態的附加信息,對於耳麥類型還有一個name的附加信息。如果你創建了一個SHOW_COLOR動作,顏色值應該被設置在一個key-value對的附加信息中。

Intent對象爲插入各種類型的附加數據會有一系列的put…()方法,併爲讀取數據也會有一組類似的get…()方法。這些方法並行於Bundle對象一些方法。實際上,附加信息能夠作爲一個Bundle對象使用putExtras()和getExtras()方法來安裝和讀取。

標記(Flags)

Intent對象有各種標記,很多都是用於指示Android系統如何啓動Activity(如,Activity應該屬於哪個任務),以及啓動後如何處理(如,它是否屬於最近的Activity列表)。所有這些標記都在Intent類中定義。

Android系統和平臺相關的應用都採用Intent對象來發出面向系統的廣播和激活系統定義的組件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章