Intent filters中的節點

來源:互聯網
上載者:User

 

看了別人總結的這篇文章,才有點明白,差得好遠啊。

 Intent 有兩種形式:

l 顯指定一個目標組件通過其name( Component name field), 由於組件名稱通常不會被其它應用程式的開發人員知道。所以,顯通常用在應用程式內部訊息。----如:一個Activity 啟動一個從屬的service或者啟動另一個activity

l 隱式意圖不指定目標組件名稱(component name 是空的)隱式意圖通常用於去啟用其它應用程式的組件

Android 傳遞了一個顯給一個被指定的目標類的執行個體 。被傳遞的 intent object 只是定義了component name -- 它決定了將會有那個組件去處理這個intent。

針對隱式意圖需要不同的策略。在缺乏一個被指定的target的情況下,android系統必須找到最適合的組件去處理這個intent ---- 一個單一的activity 或者 service 去執行一個請求動作或者一組broadcase receiver 去響應廣播通知.

它通過將intent 對象中的內容 和 意圖過濾器(intent filters)進行比較。android系統根據intent filter開啟可以接收intent的組件. 如果一個組件沒有intent filter, 那麼它只能接受顯式intent. 如果有, 則能同時接受二者.。

Only three aspects of an Intent object are consulted when the object is tested against an intent filter:

當一個intent和intent過濾器進行比較時只會考慮以下三方面:

action
data (both URI and data type)
category

Intent filters

要告訴android系統哪個intent它們可以處理,activities,services,和 broadcast receivers 必須設定一個或者多個intent過濾器。每個過濾器描述了組件的一種能力,它過濾掉不想要的intent,留下想要的。顯則不用考慮這些。

一個過濾器中包含 一個Intent object 中的三個屬性 action,data,catrgory 。一個隱式意圖必須要通過這三項測試才能傳遞到 包含該過濾器的組件中。

測試1:Action test
<intent-filter . . . >
<action android:name="com.example.project.SHOW_CURRENT" />
<action android:name="com.example.project.SHOW_RECENT" />
<action android:name="com.example.project.SHOW_PENDING" />
. . .
</intent-filter>

如執行個體所示,當一個intent對象只能命名一個單一的action,一個過濾器則可以列出多個action。這個列表也可以是空的, 一個過濾器必須包含一個 <action> element ,否則它將阻止所有的intents要通過這個測試,在intent被指定的action必須匹配在過濾器中所列的action的其中之一。如果一個intent對象或者過濾器沒有指定action。 結果如下 :

l 如果一個filter 沒有指定任何action ,那麼則沒有任何intent會被匹配。所以,所有的intent將不會通過此測試。

l 另一方面,如果一個intent對象沒有指定任何action,那麼將自動通過此測試—只要這個過濾器中有至少一個action

測試2:Category test

<intent-filter . . . >
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
. . .
</intent-filter>

要通過category測試, Intent對象中包含的每個category必須匹配filter中的一個。Filter可以列出額外的category,但是不能漏掉 intent 對象包含的任意一個category。

原則上,一個沒有任何categorys的 Intent object 將總是通過此測試。大多數情況下是正確的。然而,也有例外,android對待所有傳入 startActivity() 中的隱式視圖,都認為它們至少包含了一個 category --- "android.intent.category.DEFAULT". . 因此,希望接收這些隱式意圖的activities必須在在它們的 intent filters 中包含”android.intent.category.DEFAULT” ..有(對於包含"android.intent.action.MAIN"
and "android.intent.category.LAUNCHER"的filter 則是例外。因為它們標記了此activity開啟了一個新的task 和 將出現在 auncher screen。它們也可以包含“com.intent.category.DEFAULT”,但沒必要)

測試3:Data test

類似於action, categories, data也是 intent filter 中的一個子節點, 可以設定多個 data節點,也可以一個不設定。

如:

<intent-filter . . . >
<data android:mimeType="video/mpeg" android:scheme="http" . . . />
<data android:mimeType="audio/mpeg" android:scheme="http" . . . />
. . .
</intent-filter>

每個< data > 元素可以指定一個 URI 和 一個 data type (MIME media type) . URI 有以下幾個屬性群組成 : schema, host,port,path

Schema://host:port/path

例如:

content://com.example.project:200/folder/subfolder/etc

在上例中 schema 是 content: host: com.example.project

Port: 200 Path: folder/subfolder/etc

主機 host 和 port 一起組成了URI authority,如果沒有指定 host,那麼port將被忽略。

<data>節點中的屬性都是可選的,但它們並非相互獨立。要使一個authority 有意義,必須要指定 scheme 。 要是 path 有意義, scheme 和 authority(host:port) 必須指定。

當Intent對象中的URI 和 intent filter 進行比較時,它只會進行部門比較。 例如: 如果一個 filter 只指定了一個scheme , 那麼所有包含該scheme的URI都會匹配。 如果一個filter只指定了 scheme 和 authority ,沒有path, 那麼所有包含此scheme 和 authority 將會匹配。如果一個filter指定了一個scheme,authority, 和一個path, 那麼只有包含同樣的 scheme,authoritym,path會匹配。 但是,對於path,我們可以使用萬用字元進行部門匹配。

<data>節點的 type 屬性指定了 data的MIME type。 它比在filter中的URI 更常見 intent對象和filter都可以使用 “*” 萬用字元作為子類型 – 例如: "text/*" or "audio/*"--- 表示所有子類型都匹配。

data test 會將 intent對象中的URI 和 data type 與filter指定的都進行比較。 規則如下:

a) 如果一個intent 沒有指定URI 和 data type , 那麼如果filter中也是同樣,則通過測試。

b) 如果一個iintent 有URI 但是沒有 data type(或者是data type不能從uri中推斷出來 ) 只能通過這樣的filter: uri匹配, 並且不指定類型. 這種情況限於類似mailto:和tel:這樣的不指定實際資料的uri.

c) 如果一個intent 包含 data type 但是沒有 uri ,那麼 filter中列出相同的data type 並且沒有指定URI 則通過測試。

d) 如果一個intent包含一個URI 和data type (或者data type 可以從URI中推斷出來),那麼filter列出的有相同data type ,intent對象的uri要麼和filter中的uri匹配,要麼intent的uri為 content: or file: 並且filter不指定uri

如果一個Intent 可以通過多個activity或者filter的filter,那麼使用者將會被詢問需要啟用哪個組件。 如果一個都沒有的話,將會拋出異常。

Common cases

這個規則是針對 data test 中的規則d) ,它反映出組件可以從一個file或者content provider 擷取本機資料。因此,filters 可以是設定data type並且沒有必要明確的將 scheme 命名為 content: 和 file: 。

下面的 <data>元素,告訴android該組件可以從content provider中擷取image data 並顯示她。

<data android:mimeType="image/*" />

由於大部分可用的資料都是由content provider提供, 指定資料類型但不指定uri的filter是最常見的情況.

Another common configuration is filters with a scheme and a data type. For example, a <data> element like the following tells Android that the component can get video data from the network and display it:

設定了 scheme 和 data type是 另一個比較常見的配置是 。下面的 <data>元素,告訴android該組件可以從網上擷取video並顯示

<data android:scheme="http" android:type="video/*" />

考慮當使用者在一個web page上點了一個連結後,瀏覽器應用程式做了什麼。 它首先會試圖去顯示該資料(當做一個html頁來處理)。如果它不能顯示此資料,它會使用一個設定 scheme 和 data type 的隱式意圖 去啟動一個能顯示此資料的activity。如果沒有找到接受者,它會調用下載管理員去下載該資料,然後將其放在content provider的控制之下,這樣很多activitys (那些之命名了datatype)可以處理該資料

大部分應用程式還有一種方式可以單獨啟動,不用去引用特別的資料。那些要啟動應用程式的activity 必須 設定 "android.intent.action.MAIN" 作為action。

如果還要顯示在程式啟動器上則必須設定 "android.intent.category.LAUNCHER" 為 category.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.