Android中隱式Intent的匹配規(guī)則

本文主要介紹了隱式Intent匹配目標(biāo)組件的規(guī)則胎挎,若有敘述不清晰或是不準(zhǔn)確的地方希望大家指出杉辙,謝謝大家: )

Intent簡介

Intent用于在一個(gè)組件(Component,如Activity、Service、Broadcast Receiver)中打開另一個(gè)組件掖蛤。可分為隱式(implicitly)和顯式(explicitly)兩種:

  • Explicitly Intent:在知道要打開哪個(gè)具體的Component時(shí)使用井厌,通過指定調(diào)用者和被調(diào)用者即可打開目標(biāo)Component蚓庭;
  • Implicitly Intent:在不確切的知道要打開哪個(gè)Component的情況下,通過指出action仅仆、data器赞、category,系統(tǒng)會(huì)尋找到匹配的Component蝇恶。

Explicitly Intent

當(dāng)明確知道你想打開哪個(gè)Component時(shí)拳魁,它就是你的菜惶桐。通常這樣使用:

Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("key", "value");
startActivity(intent);

執(zhí)行以上代碼會(huì)導(dǎo)致目標(biāo)Component(這里是MainActivity)被創(chuàng)建(onCreate(...)等一系列生命周期方法被調(diào)用)撮弧。在MainAcitivity中的相應(yīng)生命周期方法中通過getIntent.getXxxExtra(“key”)即可得到隨Intent一起傳過來的數(shù)據(jù)。

Implicitly Intent

Implicitly Intent很好的實(shí)現(xiàn)了調(diào)用者和被調(diào)用者之間的解耦:調(diào)用者通過action姚糊、data贿衍、category這三個(gè)方面描述他的Intent,被調(diào)用者通過在manifest文件中聲明的一系列Intent Filter來描述自己能夠響應(yīng)哪些意圖救恨。如此一來贸辈,調(diào)用者和被調(diào)用者無需互相了解,通過Implicitly Intent這個(gè)聯(lián)系他們的紐帶就能很好的協(xié)同工作肠槽。

關(guān)于Intent更加詳細(xì)的介紹擎淤,大家可以參考官方文檔或是相關(guān)博文奢啥,這里主要介紹下Implicitly Intent的匹配規(guī)則。

Intent Filter匹配規(guī)則

只有action嘴拢、data桩盲、category三方都匹配,Intent才算是匹配成功席吴,進(jìn)而才能打開相應(yīng)的Component赌结。一個(gè)Component若聲明了多個(gè)Intent Filter,只需要匹配任意一個(gè)即可啟動(dòng)該組件孝冒。*

action的匹配規(guī)則

一個(gè)Intent Filter中可聲明多個(gè)action柬姚,Intent中的action與其中的任一個(gè)action在字符串形式上完全相同(注意,區(qū)分大小寫)庄涡,action方面就匹配成功量承。可通過setAction方法為Intent設(shè)置action穴店,也可在構(gòu)造Intent時(shí)傳入action宴合。需要注意的是,隱式Intent必須指定action(如不指定action則必須指定data或mimetype迹鹅。這種情況下卦洽,只要IntentFilter至少含有一個(gè)action就可以匹配)。比如我們在Manifest文件中為MyActivity定義了如下Intent Filter:

<intent-filter> 
  <action android:name="android.intent.action.SEND"/> 
  <action android:name="android.intent.action.SEND_TO"/>
</intent-filter>

那么只要Intent的action為“SEND”或“SEND_TO”斜棚,那么這個(gè)Intent在action方面就能和上面那個(gè)Activity匹配成功阀蒂。比如我們的Intent定義如下:

Intent intent = new Intent("android.intent.action.SEND");

那么我們的Intent在action方面就與MyActivity匹配了。
Android系統(tǒng)預(yù)定義了許多action弟蚀,這些action代表了一些常見的操作蚤霞。常見action如下(Intent類中的常量):

Intent.ACTION_VIEW
Intent.ACTION_DIAL
Intent.ACTION_SENDTO
Intent.ACTION_SEND
Intent.ACTION_WEB_SEARCH
data的匹配規(guī)則

data可進(jìn)一步分為uri(由scheme、host义钉、port昧绣、path | pathPattern | pathPrefix這4部分組成)和mimetype。Intent的uri可通過setData方法設(shè)置捶闸,mimetype可通過setType方法設(shè)置夜畴。隱式Intent也必須指定data。同action類似删壮,只要Intent的data只要與Intent Filter中的任一個(gè)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會(huì)把mimeType置為null,setType會(huì)把uri置為null粘秆。下面我們來舉例說明一下data的匹配墩朦。首先我們先來看一下Intent Filter中指定data的語法:

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

其中scheme、host等各個(gè)部分無需全部指定翻擒。假如我們?yōu)镸yActivity的Intent Filter指定了如下data:

<intent-filter> 
  <data android:mimeType="vidoe/mpeg" android:scheme="http" android:host="www.xxx.com" /> 
  <data android:mimeType="text/plain" android:scheme="http" />
</intent-filter>

那么我們的Intent想要匹配氓涣,mimeType可以為”text/plain"或“video/mpeg",scheme必須為”http“,host則沒有限制陋气,因?yàn)榈诙€(gè)data沒有指定host劳吠。

category的匹配規(guī)則

與action和data不同,**Intent中的category必須都在Intent Filter中出現(xiàn)才算匹配成功巩趁。Intent可以不指定category痒玩,若Intent中未指定category,系統(tǒng)會(huì)自動(dòng)為它帶上“android.intent.category.DEFAULT”议慰。所以蠢古,想要接收Implicitly Intent的Component都必須在manifest文件中的Intent Filter聲明中帶上“android.intent.category.DEFAULT”。我們可以通過addCategory方法為Intent添加category别凹。

查詢是否有可接收指定Intent的Component

采用PackageManager的resolveActivity或者Intent的resolveActivity方法會(huì)獲得最適合Intent的一個(gè)Activity草讶;調(diào)用PackageManager的queryIntentActivities會(huì)返回所有成功匹配Intent的Activity。關(guān)于這幾個(gè)方法的詳細(xì)定義大家可以參考官方文檔炉菲,這里不再贅述堕战。

參考資料

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

2.Android Docs

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拍霜,隨后出現(xiàn)的幾起案子嘱丢,更是在濱河造成了極大的恐慌,老刑警劉巖祠饺,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件越驻,死亡現(xiàn)場離奇詭異,居然都是意外死亡道偷,警方通過查閱死者的電腦和手機(jī)缀旁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來试疙,“玉大人诵棵,你說我怎么就攤上這事抠蚣∽?酰” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長怀跛。 經(jīng)常有香客問我距贷,道長,這世上最難降的妖魔是什么吻谋? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任忠蝗,我火速辦了婚禮,結(jié)果婚禮上漓拾,老公的妹妹穿的比我還像新娘阁最。我一直安慰自己,他們只是感情好骇两,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布速种。 她就那樣靜靜地躺著,像睡著了一般低千。 火紅的嫁衣襯著肌膚如雪配阵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天示血,我揣著相機(jī)與錄音棋傍,去河邊找鬼。 笑死难审,一個(gè)胖子當(dāng)著我的面吹牛瘫拣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播告喊,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼拂铡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了葱绒?” 一聲冷哼從身側(cè)響起感帅,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎地淀,沒想到半個(gè)月后失球,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帮毁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年实苞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烈疚。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡黔牵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出爷肝,到底是詐尸還是另有隱情猾浦,我是刑警寧澤陆错,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站金赦,受9級(jí)特大地震影響音瓷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜夹抗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一绳慎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漠烧,春花似錦杏愤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至摆舟,卻和暖如春亥曹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恨诱。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國打工媳瞪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人照宝。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓蛇受,卻偏偏與公主長得像,于是被迫代替她去往敵國和親厕鹃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子兢仰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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

  • Intent簡介Android中提供了Intent機(jī)制來協(xié)助應(yīng)用間的交互與通訊,Intent負(fù)責(zé)對(duì)應(yīng)用中一次操作的...
    Android_lml閱讀 967評(píng)論 1 7
  • 顯示Intent和隱式Intent Android中的Intent是一個(gè)非常重要且常用的類剂碴,可以用來在一個(gè)組件中啟...
    獅_子歌歌閱讀 1,184評(píng)論 0 2
  • 目錄 1.Intent 2.Intent類型 3.Intent中的主要信息 4.使用實(shí)例 5.Intent傳遞對(duì)象...
    gaaaaaaaaaao閱讀 988評(píng)論 0 3
  • 上有天堂忆矛,下有蘇杭察蹲,蘇州自古以來就是文人雅士聚集之地,此地居民富庶催训,自然也精于享受生活洽议。喝茶,在蘇州就是一件尋常百...
    芊芃閱讀 1,114評(píng)論 0 0
  • 首先說結(jié)論:單純來講安卓不比IOS差,兩者都是非常優(yōu)秀的手機(jī)系統(tǒng)采驻。 安卓的特點(diǎn)是開放性审胚,優(yōu)點(diǎn)是可玩性高 IOS的特...
    雪牙閱讀 808評(píng)論 0 0