Intent Filter匹配原則

    應用程序的組件爲了告訴Android本身能響應、處理哪些隱式Intent請求,能夠聲明一個甚至多個Intent Filter。每一個Intent Filter描述該組件所能響應Intent請求的能力——組件但願接收什麼類型的請求行爲,什麼類型的請求數據。好比以前請求網頁瀏覽器這個例子中,網 頁瀏覽器程序的Intent Filter就應該聲明它所但願接收的Intent Action是WEB_SEARCH_ACTION,以及與之相關的請求數據是網頁地址URI格式。如何爲組件聲明本身的Intent Filter? 常見的方法是在AndroidManifest.xml文件中用屬性<Intent-Filter>描述組件的Intent Filter。java

    前面咱們提到,隱式Intent(Explicit Intents)和Intent Filter(Implicit Intents)進行比較時的三要素是Intent的動做、數據以及類別。實際上,一個隱式Intent請求要可以傳遞給目標組件,必要經過這三個方面的檢查。若是任何一方面不匹配,Android都不會將該隱式Intent傳遞給目標組件。接下來咱們講解這三方面檢查的具體規則。android

1.動做測試

<intent-filter>元素中能夠包括子元素<action>,好比:瀏覽器

<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-filter>元素至少應該包含一個<action>,不然任何Intent請求都不能和 該<intent-filter>匹配。若是Intent請求的Action和<intent-filter>中個某一 條<action>匹配,那麼該Intent就經過了這條<intent-filter>的動做測試。若是Intent請求 或<intent-filter>中沒有說明具體的Action類型,那麼會出現下面兩種狀況。
(1) 若是<intent-filter>中沒有包含任何Action類型,那麼不管什麼Intent請求都沒法和這條<intent-filter>匹配;
(2) 反之,若是Intent請求中沒有設定Action類型,那麼只要<intent-filter>中包含有Action類型,這個Intent請求就將順利地經過<intent-filter>的行爲測試。ide

2.類別測試

<intent-filter>元素能夠包含<category>子元素,好比:學習

<intent-filter . . . >
<category android:name=」android.Intent.Category.DEFAULT」 />
<category android:name=」android.Intent.Category.BROWSABLE」 />
</intent-filter>

    只有當Intent請求中全部的Category與組件中某一個IntentFilter的<category>徹底匹配時,纔會讓該 Intent請求經過測試,IntentFilter中多餘的<category>聲明並不會致使匹配失敗。一個沒有指定任何類別測試的 IntentFilter僅僅只會匹配沒有設置類別的Intent請求。測試

3.數據測試

    數據在<intent-filter>中的描述以下:code

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

    <data>元素指定了但願接受的Intent請求的數據URI和數據類型,URI被分紅三部分來進行匹配:scheme、 authority和path。其中,用setData()設定的Inteat請求的URI數據類型和scheme必須與IntentFilter中所指 定的一致。若IntentFilter中還指定了authority或path,它們也須要相匹配纔會經過測試。xml

4.簡單例子說明

    講解完Intent基本概念以後,接下來咱們就使用Intent激活Android自帶的電話撥號程序,經過這個實例你會發現,使用Intent並不像其概念描述得那樣難。最終建立Intent的代碼以下所示。ci

Intent i = new Intent(Intent.ACTION_DIAL,Uri.parse(」tel://13800138000″));

    建立好Intent以後,你就能夠經過它告訴Android但願啓動新的Activity了。it

startActivity(i);


Activity啓動後顯示界面以下:
簡單例子

5.總結說明

    這篇文章是我剛開始學習Android時看到的,當時理解的不是很深刻,如今再回頭看這篇文章總結的很詳細,在這裏與你們分享。

相關文章
相關標籤/搜索