應用程序的組件為了告訴Android自己能響應、處理哪些隱式Intent請求,可以聲明一個甚至多個Intent Filter。每個Intent Filter描述該組件所能響應Intent請求的能力——組件希望接收什么類型的請求行為,什么類型的請求數據。比如之前請求網頁瀏覽器這個例子中,網頁瀏覽器程序的Intent Filter就應該聲明它所希望接收的Intent Action是WEB_SEARCH_ACTION,以及與之相關的請求數據是網頁地址URI格式。如何為組件聲明自己的Intent Filter? 常見的方法是在AndroidManifest.xml文件中用屬性<Intent-Filter>描述組件的Intent Filter。
前面我們提到,隱式Intent(Explicit Intents)和Intent Filter(Implicit Intents)進行比較時的三要素是Intent的動作、數據以及類別。實際上,一個隱式Intent請求要能夠傳遞給目標組件,必要通過這三個方面的檢查。如果任何一方面不匹配,Android都不會將該隱式Intent傳遞給目標組件。接下來我們講解這三方面檢查的具體規則。
1.動作測試
<intent-filter>元素中可以包括子元素<action>,比如:
一條<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>的行為測試。
2.類別測試
<intent-filter>元素可以包含<category>子元素,比如:
只有當Intent請求中所有的Category與組件中某一個IntentFilter的<category>完全匹配時,才會讓該Intent請求通過測試,IntentFilter中多余的<category>聲明并不會導致匹配失敗。一個沒有指定任何類別測試的IntentFilter僅僅只會匹配沒有設置類別的Intent請求。
3.數據測試
數據在<intent-filter>中的描述如下:
<data>元素指定了希望接受的Intent請求的數據URI和數據類型,URI被分成三部分來進行匹配:scheme、authority和path。其中,用setData()設定的Inteat請求的URI數據類型和scheme必須與IntentFilter中所指定的一致。若IntentFilter中還指定了authority或path,它們也需要相匹配才會通過測試。
4.簡單例子說明
講解完Intent基本概念之后,接下來我們就使用Intent激活Android自帶的電話撥號程序,通過這個實例你會發現,使用Intent并不像其概念描述得那樣難。最終創建Intent的代碼如下所示。
Intent i = new Intent(Intent.ACTION_DIAL,Uri.parse(”tel://13800138000″));
創建好Intent之后,你就可以通過它告訴Android希望啟動新的Activity了。
startActivity(i);
Activity啟動后顯示界面如下:
前面我們提到,隱式Intent(Explicit Intents)和Intent Filter(Implicit Intents)進行比較時的三要素是Intent的動作、數據以及類別。實際上,一個隱式Intent請求要能夠傳遞給目標組件,必要通過這三個方面的檢查。如果任何一方面不匹配,Android都不會將該隱式Intent傳遞給目標組件。接下來我們講解這三方面檢查的具體規則。
1.動作測試
<intent-filter>元素中可以包括子元素<action>,比如:
1.
<
intent-filter
>
2.
<
action
android:name=”com.example.project.SHOW_CURRENT” />
3.
<
action
android:name=”com.example.project.SHOW_RECENT” />
4.
<
action
android:name=”com.example.project.SHOW_PENDING” />
5.
</
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>的行為測試。
2.類別測試
<intent-filter>元素可以包含<category>子元素,比如:
1.
<
intent-filter
. . . >
2.
<
category
android:name=”android.Intent.Category.DEFAULT” />
3.
<
category
android:name=”android.Intent.Category.BROWSABLE” />
4.
</
intent-filter
>
只有當Intent請求中所有的Category與組件中某一個IntentFilter的<category>完全匹配時,才會讓該Intent請求通過測試,IntentFilter中多余的<category>聲明并不會導致匹配失敗。一個沒有指定任何類別測試的IntentFilter僅僅只會匹配沒有設置類別的Intent請求。
3.數據測試
數據在<intent-filter>中的描述如下:
1.
<
intent-filter
. . . >
2.
<
data
android:type=”video/mpeg” android:scheme=”http” . . . />
3.
<
data
android:type=”audio/mpeg” android:scheme=”http” . . . />
4.
</
intent-filter
>
<data>元素指定了希望接受的Intent請求的數據URI和數據類型,URI被分成三部分來進行匹配:scheme、authority和path。其中,用setData()設定的Inteat請求的URI數據類型和scheme必須與IntentFilter中所指定的一致。若IntentFilter中還指定了authority或path,它們也需要相匹配才會通過測試。
4.簡單例子說明
講解完Intent基本概念之后,接下來我們就使用Intent激活Android自帶的電話撥號程序,通過這個實例你會發現,使用Intent并不像其概念描述得那樣難。最終創建Intent的代碼如下所示。
Intent i = new Intent(Intent.ACTION_DIAL,Uri.parse(”tel://13800138000″));
創建好Intent之后,你就可以通過它告訴Android希望啟動新的Activity了。
startActivity(i);
Activity啟動后顯示界面如下:
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
