IntentFilter 的匹配規(guī)則與例子

參考##

1.《Android開發(fā)藝術(shù)探索》

主要針對隱式調(diào)用,隱士調(diào)用需要intent能夠匹配目標(biāo)組件的IntentFilter所設(shè)置的信息,如:啟動服務(wù)、廣播禁灼、Activity等;
IntentFilter的過濾信息有action轿曙、category弄捕、data僻孝,
如下:

<!-- 對外處理推送,web打開app的中轉(zhuǎn)Activity -->
        <activity
            android:name=".open.TransferActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" >
            <intent-filter android:priority="0x7FFFFFFF" >
                <action android:name="android.intent.action.VIEW" />
                <!-- 顯示數(shù)據(jù) -->
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <!-- 定義成瀏覽器類型守谓,有URL需要處理時會過濾 -->
                <data
                    android:host="better.com"
                    android:scheme="open.better" />
            </intent-filter>
        </activity>

為匹配規(guī)則列表穿铆,需要同時匹配過濾列表中 action、category斋荞、data信息荞雏;

action的匹配規(guī)則###

action是一個字符串,系統(tǒng)也預(yù)定義了一些平酿,我們也可以自定義凤优,如要匹配,必須和intent中的action的完全一致蜈彼,并區(qū)分大小寫筑辨;
只要intent中的action能夠和過濾規(guī)則中的任何一個action相同,即匹配成功幸逆;

常用的系統(tǒng)的自帶的action:

  1. Intent.ACTION_MAIN( android.intent.action.MAIN ): 應(yīng)用入口棍辕;
  2. Intent.ACTION_VIEW(android.intent.action.VIEW): 用于顯示用戶的數(shù)據(jù),比較通用还绘,會根據(jù)用戶的數(shù)據(jù)類型打開相應(yīng)的Activity楚昭;

category的匹配規(guī)則###

與action類型,系統(tǒng)也預(yù)定義了一些蚕甥; 如果intent中含有category哪替,如果目標(biāo)組件中栋荸,含有此category菇怀,則表示匹配成功;另外系統(tǒng)會默認(rèn)在intent添加 android.intent.category.DEFAULT晌块,這個category爱沟,為了 activity能接收到隱式調(diào)用,需要在intent-filter中指定 DEFAULT這個category匆背,如上圖呼伸;

data的匹配規(guī)則###

data的匹配規(guī)則和action類似,如果過濾規(guī)則中钝尸,定義了data括享,那么intent中,也要定義可匹配的data珍促;
data的語法結(jié)構(gòu)

<data android:scheme="string"
     android:host=""
     android:port="" 
     android:path=""
     android:pathPattern=""
     android:pathPrefix=""
     android:mimeType=""
/>

她其實(shí)就是由2部分組成:mimeType 和 URI铃辖,mimeType指定媒體類型,如:image/jpeg,
uri為:

<scheme>://<host>:<port>/[<path>|<pathPrefix>|pathPattern]

path表示完整的路徑信息猪叙;
pathPattern亦可表示路徑娇斩,但可包含通配符()仁卷,如:"\", 表示匹配任何字符;
pathPrefix表示路徑前綴犬第;

data匹配規(guī)則
data要求intent中必須含有data數(shù)據(jù)锦积,并且data數(shù)據(jù)能夠完成匹配過濾規(guī)則中的某一個data。這里完全匹配指定的是過濾規(guī)則中的data部分也出現(xiàn)在了intent中的data中歉嗓;

  1. 如下規(guī)則:
<!-- --> 
<intent-filter>
    <data android:mimeType="image/*"/>
    ....
</intent-filter>

指定媒體類型為所有圖片丰介,如:intent為 intent.setDataAndType(Uri.parse("file://abc"), "image/png") ;這種intentFilter雖然沒有指定URI遥椿,系統(tǒng)會有默認(rèn)值設(shè)定基矮,默認(rèn)值為content和file;即:URI的schema是有默認(rèn)值的;
如要為intent指定完整的data冠场,必須要調(diào)用 setDataAndType方法家浇;


避免異常###

如果通過intent隱式意圖來啟動activity,如果沒有任何匹配碴裙,App會crash钢悲,為避免此情況發(fā)生,
可以先判斷一下舔株,采用PackageManger的resolveActivity或 Intent的resolveActivity方法莺琳;


具體的例子###

回到,文章開頭的示例配置载慈,我們配置了惭等,可以通過瀏覽器(category:android.intent.category.BROWSABLE),startActivity(android.intent.category.DEFAULT) 2種外部啟動方式办铡,來啟動該Activity辞做;

// 通過intent來啟動,比如:其他app寡具,打開本app秤茅,需要傳遞特定參數(shù)時
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri uri = Uri.parse("open.better://better.com?type=otherInfo");  // type為傳遞的參數(shù);
intent.setData(uri);
startActivity(intent);

// 通過http:// 鏈接形式啟動
<a href="open.better://better.com?type=type01">打開Better</a>

// 具體解析:
Uri data = getIntent().getData();       // 來自外部鏈接
// 處理intent
 Intent bizIntent = null;
 // 來自 外部啟動
if (data != null) {
            String scheme = data.getScheme();       // scheme
              // 如果來著 web 啟動
                if (“open.better”.equals(scheme)) {
                    String host = data.getHost();                        // host
                    String type = StringUtils.convertToSafeString(data.getQueryParameter("type"));
   // 其他操作
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末童叠,一起剝皮案震驚了整個濱河市框喳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌厦坛,老刑警劉巖五垮,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杜秸,居然都是意外死亡放仗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門亩歹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匙监,“玉大人凡橱,你說我怎么就攤上這事⊥だ眩” “怎么了稼钩?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長达罗。 經(jīng)常有香客問我坝撑,道長,這世上最難降的妖魔是什么粮揉? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任巡李,我火速辦了婚禮,結(jié)果婚禮上扶认,老公的妹妹穿的比我還像新娘侨拦。我一直安慰自己,他們只是感情好辐宾,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布狱从。 她就那樣靜靜地躺著,像睡著了一般叠纹。 火紅的嫁衣襯著肌膚如雪季研。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天誉察,我揣著相機(jī)與錄音与涡,去河邊找鬼。 笑死持偏,一個胖子當(dāng)著我的面吹牛驼卖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播综液,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼款慨,長吁一口氣:“原來是場噩夢啊……” “哼儒飒!你這毒婦竟也來了谬莹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤桩了,失蹤者是張志新(化名)和其女友劉穎附帽,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體井誉,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蕉扮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了颗圣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喳钟。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡屁使,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奔则,到底是詐尸還是另有隱情蛮寂,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布易茬,位于F島的核電站酬蹋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抽莱。R本人自食惡果不足惜范抓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望食铐。 院中可真熱鬧匕垫,春花似錦、人聲如沸虐呻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铃慷。三九已至单芜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間犁柜,已是汗流浹背洲鸠。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馋缅,地道東北人扒腕。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像萤悴,于是被迫代替她去往敵國和親瘾腰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容