Android中的Intent Filter匹配規則介紹
本文主要介紹了隱式Intent匹配目標元件的規則,若有敘述不清晰或是不準確的地方希望大家指出,謝謝大家: )
1. Intent簡介
Intent用於在一個元件(Component,如Activity、Service、Broadcast Receiver)中開啟另一個元件。
Intent可分為隱式(implicitly)和顯式(explicitly)兩種:
Explicitly Intent:在知道要開啟哪個具體的Component時使用,透過指定呼叫者和被呼叫者即可開啟目標Component;
Implicitly Intent:在不確切的知道要開啟哪個Component的情況下,透過指出action、data、category,系統會尋找到匹配的Component。
(1)Explicitly Intent
當明確知道你想開啟哪個Component時,它就是你的菜。通常這樣使用:
Intent intent = new Intent(this, MainActivity.class); intent.putExtra("key", "value"); startActivity(intent);
執行以上程式碼會導致目標Component(這裡是MainActivity)被建立(onCreate等一系列生命週期方法被呼叫)。在MainAcitivity中的相應生命週期方法中透過getIntent.getXxxExtra(“key”)即可得到隨Intent一起傳過來的資料。
(2)Implicitly Intent
Implicitly Intent很好的實現了呼叫者和被呼叫者之間的解耦:
呼叫者透過action、data、category這三個方面描述他的Intent,被呼叫者透過在manifest檔案中宣告的一系列來描述自己能夠響應哪些意圖。如此一來,呼叫者和被呼叫者無需互相瞭解,透過Implicitly Intent這個聯絡他們的紐帶就能很好的協同工作。
關於Intent更加詳細的介紹,大家可以參考官方文件或是相關博文,這裡主要介紹下Implicitly Intent的匹配規則。
2.Intent Filter匹配規則
只有action、data、category三方都匹配,Intent才算是匹配成功,進而才能開啟相應的Component。一個Component若宣告瞭多個Intent Filter,只需要匹配任意一個即可啟動該元件。
(1)action的匹配規則
一個Intent Filter中可宣告多個action,Intent中的action與其中的任一個action在字串形式上完全相同(注意,區分大小寫),action方面就匹配成功。可透過setAction方法為Intent設定action,也可在構造Intent時傳入action。需要注意的是,隱式Intent必須指定action。比如我們在Manifest檔案中為MyActivity定義瞭如下Intent Filter:
那麼只要Intent的action為“SEND”或“SEND_TO”,那麼這個Intent在action方面就能和上面那個Activity匹配成功。比如我們的Intent定義如下:
Intent intent = new Intent("android.intent.action.SEND") ...
那麼我們的Intent在action方面就與MyActivity匹配了。
Android系統預定義了許多action,這些action代表了一些常見的操作。常見action如下(Intent類中的常量):
Intent.ACTION_VIEW
Intent.ACTION_DIAL
Intent.ACTION_SENDTO
Intent.ACTION_SEND
Intent.ACTION_WEB_SEARCH
(2)data的匹配規則
data可進一步分為uri(由scheme、host、port、path | pathPattern | pathPrefix這4部分組成)和mimetype。Intent的uri可透過setData方法設定,mimetype可透過setType方法設定。隱式Intent也必須指定data。同action類似,只要Intent的data只要與Intent Filter中的任一個data宣告完全相同,data方面就匹配成功。需要注意的是:若Intent Filter的data宣告部分未指定uri,則預設uri為content或file,Intent中的uri的scheme部分需為content或file才能匹配;若要為Intent指定完整的data,必須用setDataAndType方法,原因請看setData和setType方法的原始碼:
public Intent setData(Uri data) { mData = data; mType = null; return this; }public Intent setType(String type) { mData = null; mType = type; return this; }
從以上程式碼可以看到,setData會把mimeType置為null,setType會把uri置為null。下面我們來舉例說明一下data的匹配。首先我們先來看一下Intent Filter中指定data的語法:
其中scheme、host等各個部分無需全部指定。假如我們為MyActivity的Intent Filter指定了如下data:
那麼我們的Intent想要匹配,mimeType可以為”text/plain”或“video/mpeg”,scheme必須為”http“,host則沒有限制,因為第二個data沒有指定host。
(3)category的匹配規則
與action和data不同,Intent中的category必須都在Intent Filter中出現才算匹配成功。Intent可以不指定category,若Intent中未指定category,系統會自動為它帶上“android.intent.category.DEFAULT”。所以,想要接收Implicitly Intent的Component都必須在manifest檔案中的Intent Filter宣告中帶上“android.intent.category.DEFAULT”。我們可以透過addCategory方法為Intent新增category。
(4)查詢是否有可接收指定Intent的Component
採用PackageManager的resolveActivity或者Intent的resolveActivity方法會獲得最適合Intent的一個Activity;呼叫PackageManager的queryIntentActivities會返回所有成功匹配Intent的Activity。關於這幾個方法的詳細定義大家可以參考官方文件,這裡不再贅述。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2524/viewspace-2810578/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 你必須弄懂的Intent Filter匹配規則IntentFilter
- Android中Intent物件與Intent Filter過濾匹配過程詳解AndroidIntent物件Filter
- 【筆記】【Android】Manifest中的intent-filter使用筆記AndroidIntentFilter
- js中原型的規則介紹JS原型
- Activity配置檔案中的intent-filterIntentFilter
- 正則匹配規則2
- Apache的rewrite規則詳細介紹Apache
- Android中的intentAndroidIntent
- 常用正規表示式匹配程式碼介紹
- nginx location匹配規則Nginx
- oracle10g的正則規則匹配Oracle
- Nginx匹配規則練習Nginx
- modsecurity:規則例子:匹配url
- nginx的location 規則匹配練習Nginx
- Devs--開源規則引擎介紹dev
- JSON格式或者規則簡單介紹JSON
- nginx location匹配及rewrite規則Nginx
- jQuery filter() 用法簡單介紹jQueryFilter
- Git中.gitignore檔案不起作用的解決以及Git中的忽略規則介紹Git
- php正則匹配所有違規字元PHP字元
- Android中Intent概述及使用AndroidIntent
- Android中Context的詳細介紹AndroidContext
- go Casbin配置檔案,以及匹配規則Go
- SAP UI5 的規則構建器控制元件介紹UI控制元件
- 黃聰:Apache 301重定向中RewriteCond規則引數介紹(轉)Apache
- TDengine3.0 流式計算引擎語法規則介紹
- rxjs Observable filter Operator 的實現原理介紹JSFilter
- Android中Intent的setData,setType和setDataAndType的用法AndroidIntent
- Android——Intent和Intent過濾器AndroidIntent過濾器
- 理解 Nginx 在處理請求時的匹配規則Nginx
- Activity的啟動模式及IntentFilter匹配規則總結模式IntentFilter
- Android Framework中的Application Framework層介紹AndroidFrameworkAPP
- Nginx接收的host值會影響alias的規則匹配Nginx
- UDEV規則的匹配鍵和RAW的一點說明dev
- 【java規則引擎】基本語法和相關屬性介紹Java
- Drools規則引擎簡介
- Android Intent ServiceAndroidIntent
- MySQL中的排序規則MySql排序