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