日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Android Intent和Intent Filter詳解(三)

 wanwanstudy 2012-02-11
  一個intent對象只能指定一個action, 而一個intent filter可以指定多個action. action列表不能為空, 否則它將組織所有的intent.

         一個intent對象的action必須和intent filter中的某一個action匹配, 才能通過.如果intent filter的action列表為空, 則不通過.如果intent對象不指定action, 并且intent filter的action列表不為空, 則通過.

         Category 測試

java代碼:
  1. <intent-filter >
  2. <category android:name="android.intent.category.DEFAULT" />
  3. <category android:name="android.intent.category.BROWSABLE" />
  4. </intent-filter>
復制代碼

         注意前面說到的對于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代碼:
  1. <intent-filter . . . >
  2. <data android:mimeType="video/mpeg" android:scheme="http" . . . />
  3. <data android:mimeType="audio/mpeg" android:scheme="http" . . . />
  4. . . .
  5. </intent-filter>
復制代碼

        每個<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代碼:
  1. <data android:mimeType="image/*" />
復制代碼

       由于大部分可用的數(shù)據(jù)由content provider提供, 指定數(shù)據(jù)類型但不指定uri的filter是最常見的情況.
       另外一個常見的配置是filter具有一個scheme和一個數(shù)據(jù)類型. 例如, 下列<data>元素告訴android該component可以從網(wǎng)絡獲取圖像數(shù)據(jù)并顯示之:

java代碼:
  1. <data android:scheme="http" android:type="video/*" />
復制代碼

       考慮用戶點擊一個網(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代碼:
  1. <intent-filter . . . >
  2. <action android:name="code android.intent.action.MAIN" />
  3. <category android:name="code android.intent.category.LAUNCHER" />
  4. </intent-filter>
復制代碼

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多