Android: Intent匹配及mimeType匹配,這一篇就夠了V系洹蟆炊!

??activity的啟動分為顯式調(diào)用和隱式調(diào)用。顯式調(diào)用需要明確指定組件的信息瀑志,來完成調(diào)用涩搓。肩祥。隱式調(diào)用是通過匹配目標(biāo)組件的IntentFilter完成的。一個(gè)組件可以設(shè)置多個(gè)IntentFilter來匹配缩膝。IntentFilter中的過濾信息有action混狠、category、data組成疾层。只有一個(gè)Intent同時(shí)匹配action類別将饺,category類別,data類別才算完全匹配痛黎,才能啟動對應(yīng)的組件予弧。一個(gè)intent只需要匹配任何一組intentFilter就可以啟動對應(yīng)組件。下面一一講解對應(yīng)的匹配規(guī)則湖饱。

一掖蛤、action的匹配規(guī)則

action是一個(gè)字符串,一個(gè)過濾規(guī)則(intentFilter)可以有多個(gè)action井厌。一個(gè)IntentFilter必須有一個(gè)action蚓庭,如果沒有那么則匹配失敗。多個(gè)action只要匹配成功一個(gè)即可匹配成功仅仆,
結(jié)論:
Intent中的action必須存在且必須和過濾規(guī)則中的其中一個(gè)action相同(字符串值完全一樣器赞,區(qū)分大小寫

二、category的匹配規(guī)則

??category是一個(gè)字符串墓拜,Intent可以沒有category港柜,但是如果一旦有category,不管有幾個(gè)咳榜,每一個(gè)都要能夠和過濾規(guī)則中的任何一個(gè)category相同夏醉。簡而言之,Intent中攜帶Category要全部能和IntentFilter中的Category匹配涌韩。
注意:
系統(tǒng)在調(diào)用startActivity或者startActivityForResult時(shí)畔柔,會默認(rèn)為Intent添加“android.intent.category.DEFAULT"這個(gè)category。
所以隱式啟動的組件必須包含<category android:name="android.intent.category.DEFAULT" />
??如果Intent中的存在category贸辈,那么這些category都必須和Activity過濾規(guī)則中的category相同释树,才能和這個(gè)Activity匹配。Intent中的category數(shù)量可能少于Activity中配置的category數(shù)量擎淤,但是Intent中的這category必須和Activity中配置的category相同才能匹配奢啥。通俗的講就是,比如Intent中有3個(gè)category嘴拢,activity的過濾規(guī)則中有5個(gè)category桩盲,那intent中的3個(gè)category需要是activity的過濾規(guī)則中有5個(gè)category中的3個(gè),若有任意一個(gè)未出現(xiàn)在這5個(gè)里面席吴,匹配就失敗赌结。

三捞蛋、data的匹配規(guī)則

??Data一般由兩部分組成mimeType和URI。

1. MimeType

??mineType指資源類型包括文本柬姚、圖片拟杉、音視頻等等×砍校可以表示圖片搬设、文本、音視頻等等不同的數(shù)據(jù)格式撕捍。以下是常見文件格式的mimeType拿穴。

<!--常見MimeType-->

<!--音視頻-->
<data android:mimeType="video/*" />
<data android:mimeType="audio/*" />
<!--圖片-->
<data android:mimeType="image/*" />
<!--文本-->
<data android:mimeType="text/*" />
<!--*、bin忧风、class dms默色、exe等-->
<!--<data android:mimeType="application/octet-stream" />-->
<!--pdf-->
<data android:mimeType="application/pdf" />
<!--prf-->
<data android:mimeType="application/pics-rules" />
<!--pot pos ppt-->
<data android:mimeType="application/vnd.ms-powerpoint" />
<!--js-->
<data android:mimeType="application/x-javascript" />
<!--zip-->
<data android:mimeType="application/zip" />
<!--rar-->
<data android:mimeType="application/rar" />
<!--rar-->
<data android:mimeType="application/x-rar-compressed" />
<!--jar-->
<data android:mimeType="application/ava-archive" />
<!--tar-->
<data android:mimeType="application/x-tar" />
<!--tgz-->
<data android:mimeType="application/x-compressed" />
<!--zip-->
<data android:mimeType="application/x-zip-compressed" />

<!--ppt-->
<data android:mimeType="application/vnd.ms-powerpoint" />
<!--xls-->
<data android:mimeType="application/vnd.ms-excel" />
<!--doc、dot-->
<data android:mimeType="application/msword" />
<!--docx-->
<data android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" />
<!--potx-->
<data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.template" />
<!--pptx-->
<data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" />
<!--xlsx-->
<data android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />
<!--xltx-->
<data android:mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.template" />
<!--ppsx-->
<data android:mimeType="application/vnd.openxmlformats-officedocument.presentationml.slideshow" />
<!--dotx-->
<data android:mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.template" />

如果不知道指定文件的mimeType的話狮腿,可以通過一下方法獲取指定文件的mimeType腿宰。

private static String getMimeType(String filePath) {
    String ext = MimeTypeMap.getFileExtensionFromUrl(filePath);
    return MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext);
}
2. URI

??一個(gè)IntentFilter中可以有多個(gè)data。匹配過程中如果intentFilter含有data那么intent中必須含有data并且只要其中某一個(gè)匹配成功即可認(rèn)為intent匹配成功蚤霞。
??URI具體結(jié)構(gòu)如下:scheme://host:port/(path|pathPrefix|pathPatten)示例如下:

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

下面一一講解對應(yīng)含義酗失。

  1. Scheme:URI的模式。即指定的URI的格式昧绣。比如http、content捶闸、file等夜畴,如果沒有指定scheme那么后面的參數(shù)都無效,即整個(gè)URI都無效删壮。
  2. Host:URI的主機(jī)名贪绘。如www.baidu.com等,如果host未指定那么這個(gè)URI也是無效的央碟。
  3. port:端口號税灌,僅當(dāng)指定了scheme和host的時(shí)候port才能起作用。
  4. path:完整的路徑信息亿虽。
  5. pathPattern:也表示完整的路徑信息菱涤,但是可以包含通配符“",”"表示0或多個(gè)等任意字符洛勉。要注意正則表達(dá)式的規(guī)范粘秆。
  6. pathPrefix:路徑前綴信息。
    注意:調(diào)用方式區(qū)別
    ??如果同時(shí)存在URI收毫、miemType調(diào)用如下方法: intent.setDataAndType(Uri.parse(""),"image/*");不能分開調(diào)用intent.setData(Uri.parse(""));和intent.setType("image/*");因?yàn)檫@兩個(gè)方法是互逆的攻走,調(diào)用一個(gè)會將另一個(gè)置null殷勘,源碼如下:
  public @NonNull Intent setType(@Nullable String type) {
        mData = null;
        mType = type;
        return this;
    }
  public @NonNull Intent setData(@Nullable Uri data) {
        mData = data;
        mType = null;
        return this;
    }

隱式調(diào)用注意事項(xiàng)

??隱式調(diào)用啟動組件之前,根據(jù)相應(yīng)的隱式條件信息查詢一下能否匹配到對應(yīng)的組件昔搂。防止直接隱式調(diào)用啟動玲销,發(fā)生錯(cuò)誤,找不到對應(yīng)的組件摘符。判斷方法分為兩種:

  1. 通過Intent的intent.resolveActivity(getPackageManager());方法查詢痒玩。示例如下:
    Intent intent=new Intent();
    intent.setDataAndType(Uri.parse("http://demo"),"image/*");
    intent.resolveActivity(getPackageManager());
  1. 通過PackageManager的resolveActivity(Intent intent, @ResolveInfoFlags int flags);方法查詢。其中第二個(gè)參數(shù)使用PackageManager.MATCH_DEFAULT_ONLY议慰,匹配那些添加了<category android:name="android.intent.category.DEFAULT"/>的組件蠢古。如果不使用這個(gè)那么可能匹配到?jīng)]有配置default標(biāo)記的category,從而導(dǎo)致startActivity失敗别凹。建議使用此方法查詢草讶。
    Intent intent=new Intent();
    intent.setDataAndType(Uri.parse("http://demo"),"image/*");
    intent.resolveActivity(getPackageManager());
    PackageManager packageManager = getPackageManager();
    packageManager.resolveActivity(intent,PackageManager.MATCH_DEFAULT_ONLY);

只要通過以上兩個(gè)方法能夠查詢到對應(yīng)的組件則一定能啟動對應(yīng)的組件。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末炉菲,一起剝皮案震驚了整個(gè)濱河市堕战,隨后出現(xiàn)的幾起案子拍霜,更是在濱河造成了極大的恐慌,老刑警劉巖祠饺,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異道偷,居然都是意外死亡缀旁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門并巍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人懊渡,你說我怎么就攤上這事【猓” “怎么了剃执?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吻谋。 經(jīng)常有香客問我,道長漓拾,這世上最難降的妖魔是什么戒祠? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任速种,我火速辦了婚禮,結(jié)果婚禮上配阵,老公的妹妹穿的比我還像新娘。我一直安慰自己棋傍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布亿絮。 她就那樣靜靜地躺著麸拄,像睡著了一般派昧。 火紅的嫁衣襯著肌膚如雪拢切。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天五慈,我揣著相機(jī)與錄音,去河邊找鬼豺撑。 笑死黔牵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的猾浦。 我是一名探鬼主播灯抛,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼金赦,長吁一口氣:“原來是場噩夢啊……” “哼对嚼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起漠烧,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎已脓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體度液,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年已慢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了霹购。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡厕鹃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出剂碴,到底是詐尸還是另有隱情,我是刑警寧澤忆矛,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站洽议,受9級特大地震影響漫拭,放射性物質(zhì)發(fā)生泄漏亚兄。R本人自食惡果不足惜采驻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望礼旅。 院中可真熱鬧,春花似錦痘系、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悉默。三九已至,卻和暖如春抄课,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背跟磨。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工抵拘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哎榴,地道東北人僵蛛。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像飘言,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子姿鸿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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

  • 什么是Intent intent是一個(gè)消息傳遞對象倒源,可以使用它從其他應(yīng)用組件請求操作。通常我們用intent來啟動...
    dony_east閱讀 838評論 0 3
  • 轉(zhuǎn)載注明出處:http://www.reibang.com/p/a7535c3f33df 1. 前言 在Andro...
    王三的貓阿德閱讀 2,879評論 0 10
  • 1. 我也來說說世界杯決賽吧热某。隨著看克羅地亞的場次不斷增多胳螟,我看到了他們穩(wěn)定的成績,不緊不慢的節(jié)奏旺隙,決賽前很看好他...
    黑黑_5210閱讀 70評論 0 0
  • 第一次來江蘇無錫這地方 然并 景色很靜然而心涼
    舒乞兒閱讀 277評論 0 0
  • 在《影》世界中周拐,隱藏著兩個(gè)很關(guān)鍵的詞語铡俐,分別是選擇和平衡妥粟。說隱藏其實(shí)也不準(zhǔn)確,因?yàn)楹芏鄸|西勾给,都是擺在了明面上的。 ...
    關(guān)雎黍離閱讀 1,163評論 0 1