一個(gè)intent對(duì)象只能指定一個(gè)action, 而一個(gè)intent filter可以指定多個(gè)action. action列表不能為空, 否則它將組織所有的intent. 一個(gè)intent對(duì)象的action必須和intent filter中的某一個(gè)action匹配, 才能通過.如果intent filter的action列表為空, 則不通過.如果intent對(duì)象不指定action, 并且intent filter的action列表不為空, 則通過. Category 測(cè)試 java代碼:
注意前面說到的對(duì)于action和category的常數(shù)是在代碼中用的,而不是manifest文件中用的. 例如, CATEGORY_BROWSABLE常數(shù)對(duì)應(yīng)xml中的表示為"android.intent.category.BROWSABLE". 一個(gè)intent要通過category測(cè)試, 那么該intent對(duì)象中的每個(gè)category都必須和filter中的某一個(gè)匹配. 理論上來說, 一個(gè)intent對(duì)象如果沒有指定category的話, 它應(yīng)該能通過任意的category 測(cè)試. 有一個(gè)例外: android把所有的傳給startActivity()的隱式intent看做至少有一個(gè)category: "android.intent.category.DEFAULT". 因此, 想要接受隱式intent的activity必須在intent filter中加入"android.intent.category.DEFAULT". Data test java代碼:
每個(gè)<data>元素指定了一個(gè)URI和一個(gè)數(shù)據(jù)類型. URI每個(gè)部分為不同的屬性 -- scheme, host, port, path: scheme://host:port/path 例如, 在如下的URI中:content://com.example.project:200/folder/subfolder/etc scheme為"content", host為"com.example.project", port為"200", path為"folder/subfolder/etc". host和port一起組成了URI authority. 如果host未指定,則port被忽略. 這些屬性都是可選的,但它們并非相互獨(dú)立: 要使一個(gè)authority有意義,必須指定一個(gè)scheme. 要使一個(gè)path有意義, 必須指定一個(gè)scheme和一個(gè)authority. 當(dāng)intent對(duì)象中的URI和intent filter中相比較時(shí), 它只和filter中定義了的部分比較. 例如, 如果filter中之定義了scheme,那么所有包含該scheme的URI的intent對(duì)象都通過測(cè)試.對(duì)于path來說,可以使用通配符來進(jìn)行部 分匹配. <data>元素的type屬性指定了數(shù)據(jù)類型. 它在filter中比在URI中更常見. intent對(duì)象和filter都可以使用"*"通配符作為子類型. 例如"text/*" "audio/*"表示所有的子類型都匹配. data測(cè)試的規(guī)則如下: 一個(gè)不含uri也不含數(shù)據(jù)類型的intent對(duì)象只通過兩者都不包含的filter. 一個(gè)含uri但不含數(shù)據(jù)類型的intent對(duì)象(并且不能從uri推斷數(shù)據(jù)類型的)只能通過這樣的filter: uri匹配, 并且不指定類型. 這種情況限于類似mailto:和tel:這樣的不指定實(shí)際數(shù)據(jù)的uri. 一個(gè)只包含數(shù)據(jù)類型但不包含URI的intent只通過這樣的filter: 該filter只列出相同的數(shù)據(jù)類型, 并且不指定uri. 一個(gè)既包含uri又包含數(shù)據(jù)類型的intent對(duì)象只通過這樣的filter: intent對(duì)象的數(shù)據(jù)類型和filter中的一個(gè)類型匹配, intent對(duì)象的uri要么和filter的uri匹配, 要么intent對(duì)象的uri為content:或者file:, 并且filter不指定uri. 如果一個(gè)intent可以通過多于一個(gè)activity或者service的filter, 那么用戶可能會(huì)被詢問需要啟動(dòng)哪一個(gè). 如果一個(gè)都沒有的話, 那么會(huì)拋出異常. Common cases 常見情況 上述的最后一個(gè)規(guī)則(d)說明了組件通??梢詮奈募蚦ontent provider中獲取數(shù)據(jù). 因此, 它們的filter可以只列出數(shù)據(jù)類型不列scheme. 這是個(gè)特殊情況. 下列<data>元素告訴android該組件可以從一個(gè)content provider取得圖像數(shù)據(jù)并顯示之: java代碼:
由于大部分可用的數(shù)據(jù)由content provider提供, 指定數(shù)據(jù)類型但不指定uri的filter是最常見的情況. 另外一個(gè)常見的配置是filter具有一個(gè)scheme和一個(gè)數(shù)據(jù)類型. 例如, 下列<data>元素告訴android該component可以從網(wǎng)絡(luò)獲取圖像數(shù)據(jù)并顯示之: java代碼:
考慮用戶點(diǎn)擊一個(gè)網(wǎng)頁時(shí)瀏覽器的動(dòng)作. 它首先試圖顯示這個(gè)數(shù)據(jù)(當(dāng)做一個(gè)html頁來處理). 如果無法顯示, 則創(chuàng)建一個(gè)隱式intent, 并啟動(dòng)一個(gè)可以處理它的activity. 如果沒有這樣的activity, 那么它請(qǐng)求下載管理器來下載該數(shù)據(jù). 然后它將數(shù)據(jù)置于一個(gè)content provider的控制之下, 這樣有很多activity(擁有只有數(shù)據(jù)類型的filter)可以處理這些數(shù)據(jù). 大部分應(yīng)用程序還有一種方法來單獨(dú)啟動(dòng), 不需要引用任何特定的數(shù)據(jù). 這些能啟動(dòng)應(yīng)用程序的activity具有action為"android.intent.action.MAIN" 的filter. 如果它們需要在應(yīng)用程序啟動(dòng)器中顯示, 它們必須指定"android.intent.category.LAUNCHER" 的category. java代碼:
|
|