IntentFilter是什么
顧名思義IntentFilter:“意圖過濾器”诱渤,主要用來過濾隱式意圖。
當(dāng)用戶做一些操作的時(shí)候谈况,安卓系統(tǒng)會(huì)根據(jù)配置的“意圖過濾器”勺美,去尋找可以響應(yīng)操作的組件來進(jìn)行服務(wù) 。
為什么用IntentFilter
Activity有兩種啟動(dòng)模式(此處不多說)碑韵,一種是顯示跳轉(zhuǎn)励烦,一種是隱式跳轉(zhuǎn)。其中隱式跳轉(zhuǎn)就是通過匹配設(shè)置的IntentFilter進(jìn)行實(shí)現(xiàn)的泼诱。
怎么用IntentFilter(IntentFilter的匹配原則)
IntentFilter的過濾信息包含action 坛掠、category、data治筒。只有同時(shí)匹配過濾列表中的action屉栓、category、data耸袜,才能成功友多,其中一個(gè)Activity可以有多個(gè)IntentFilter,一個(gè)Intent只要能匹配任何一組IntentFilter堤框,就可以成功啟動(dòng)對(duì)應(yīng)的Activity
下面來想寫講解IntentFilter的匹配規(guī)則
1.action 的匹配規(guī)則
action其實(shí)就是一個(gè)字符串域滥,其中系統(tǒng)定義了一些action,我們也可以自己定義自己的action蜈抓。
action的匹配規(guī)則是:Intent中的action是必須存(可以有多個(gè)action)在并且必須要和過濾規(guī)則中的其中一個(gè)action完全形同(包括大小寫)
2.category 的匹配規(guī)則
category也是一個(gè)字符串启绰,系統(tǒng)也定義了一些category,我們自己也可以定義自己的category沟使。
category和action的匹配原則不同委可,Intent中不一定含有category,如果含有category腊嗡,那么所有的category必須要和過濾規(guī)則中的其中一個(gè)category相同着倾。
為什么不設(shè)置category也可以匹配拾酝?
原因是系統(tǒng)在startActivity或者startActivityForResult的時(shí)候默認(rèn)為Intent
加上一個(gè)android.intent.category.DEAFAULT,所以必須在intent-filter中
加上android.intent.category.DEFAULT這個(gè)category
3.data的匹配規(guī)則
data的匹配規(guī)則和action是一樣的卡者,只是data的結(jié)構(gòu)比較復(fù)雜
先來看一下整體的data結(jié)構(gòu)
<data
android:host="www.baidu.com"
android:mimeType="text/abc"
android:path="/my"
android:port="8080"
android:scheme="http"></data>
date有兩部分構(gòu)成:mimeType和URI蒿囤。
mimeType:(可以自己定義)結(jié)構(gòu)形式是aaa/bb
指媒體類型 例如: image/jpeg vided/* ...
URI:相當(dāng)于url 其結(jié)構(gòu)形式:
<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
詳細(xì)解釋:
Scheme:即URI的模式。如果URI中沒有指定Scheme.那么整個(gè)URI無效崇决。默認(rèn)值為content 和 file蟋软。
Host:URI的host。比如www.baidu.com嗽桩。如果指定了scheme和port岳守,path等其他參數(shù),但是host未指定碌冶,那么整個(gè)URI無效湿痢;如果只指定了scheme,沒有指定host和其他參數(shù)扑庞,URI也是無效的譬重。可以這樣理解:一個(gè)完整的URI :http://www.axe.com:500/profile/info 我將后面的port 和path“:500/profile/info ”去掉罐氨,這個(gè)URI還是有效臀规。如果我單獨(dú)將www.axe.com 拿出來那這個(gè)URI就無效了。
Port:URI端口栅隐,當(dāng)URI指定了scheme 和 host 參數(shù)時(shí)port參數(shù)才有意義塔嬉。
path:用來匹配完整的路徑,如:http://example.com/blog/abc.html租悄,這里將 path 設(shè)置為 /blog/abc.html 才能夠進(jìn)行匹配谨究;
pathPrefix: 用來匹配路徑的開頭部分,拿上面的 Uri 來說泣棋,這里將 pathPrefix 設(shè)置為 /blog 就能進(jìn)行匹配了胶哲;
pathPattern: 用表達(dá)式來匹配整個(gè)路徑。
如果想匹配上述一開始提到的例子可以這么寫:
Intent intent = new Intent();
intent.setAction("aaa");
intent.setDataAndType(Uri.parse("http://www.baidu.com:8080/my"),"text/abc");
startActivity(intent);