Android的進階學習(三)--Intent和IntentFilter

IntentFilter,顧名思義,就是Intent的過濾器淤井∠倭溃回想一下捆昏,好像Intent在我們的代碼中出現(xiàn)的頻率還是挺高的邓线,那么今天我們就來理理淌友。

Intent

Intent的意思是意圖, 而就和它的意思差不多骇陈,每當我們使用 Intent的時候震庭, 總是去想干一些事情:

  • startActivity(Intent intent)
  • startService(Intent intent)
  • bindService(Intent intent)
  • sendBrodcast(Intent intent)
  • .......

對的,我們再很多地方都會使用Intent你雌。對于這些請求器联,我們都會傳入一個Intent二汛,用來Filter并啟動相應的ActivityService拨拓、BroadcastReceiver肴颊。而在這里,我們就有兩種調(diào)用方式:顯示調(diào)用和隱式調(diào)用渣磷。

顯式調(diào)用

就像啟動Activity婿着,我們常常就是顯式的調(diào)用,那何為顯式調(diào)用呢醋界?

Intent itent = new Intent();
itent.setClass(Activity_A.this, Activity_B.class);
startActivity(itent);

哦竟宋,這就是顯式調(diào)用。之說以叫做顯式調(diào)用形纺,我們?yōu)?code>Intent清楚的指出了被啟動組件的信息(這里就是Activity_B),當調(diào)用了startActivity(itent)后丘侠,我們就只會很明確的知道,這次的任務是啟動Activity_B,而沒有其它的過程逐样。

隱式調(diào)用

看了顯式調(diào)用蜗字,應該猜都猜得到了,隱式調(diào)用就是沒有明確的指出組件信息官研。而是通過Filter去過濾出需要的組件秽澳。

Intent intent = new Intent();
intent.setAction(Intent.ACTION_BATTERY_LOW);
intent.addCategory(Intent.CATEGORY_APP_EMAIL);
intent.setDataAndType(Uri.EMPTY, "video/mpeg");
startActivity(intent);

這里就是一個隱式的調(diào)用,可以看到我為Intent設置了三個屬性Action戏羽、Category担神、Data
然后startActivity(intent)就會根據(jù)我們設置的這三個屬性去篩選合適的組件來打開始花,也就是因為這樣妄讯,所以有時候,當我們APP來分享一個東西的時候酷宵,會有很多組件(比如QQ亥贸、微信、微博...)來供我們選擇浇垦,因為他們都滿足Filter條件炕置。或許你還有許多疑問男韧,來我們就接著來看IntentFilter吧朴摊!


IntentFilter

IntentFilter的意思就是意圖過濾器,當我們隱式的啟動系統(tǒng)組件的時候,就會根據(jù)IntentFilter來篩選出合適的進行啟動此虑。

現(xiàn)在我們知道了可以在Intent啟動的時候對應設置Action甚纲、CategoryDataAndType,這里設置的是為了過濾的時候對應IntentFilter匹配action瀑踢、categorydata抚垃。

除開過濾廣播的的IntentFilter可以在代碼中創(chuàng)建外春哨,其它的IntentFilter都得在AndroidManifest.xml中給設置荆隘。

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_BATTERY_LOW);
intentFilter.addCategory(Intent.CATEGORY_APP_EMAIL);
intentFilter.addDataType("video/mpeg");
Reciver reciver = new Reciver();
registerReceiver(reciver, intentFilter);

這里就是在代碼中設置IntentFilter,可以看到我們設置了三個屬性。讓后我們再看看在AndroidManifest.xml的設置方法:

<activity  android:name=".Activity_B"    
           android:label="@string/title_activity_activity__b"
           android:launchMode="singleInstance">  
  <intent-filter> 
    <action android:name="android.intent.action.ANSWER" />    
    <category android:name="android.intent.category.APP_EMAIL" />        
    <data  android:host="www.mathiasluo.com"   
           android:scheme="http" />  
  </intent-filter>
</activity>

我們在這里給Activity設置了一個IntentFilter悲靴,但是值得注意的是臭胜,一個組件可以有多個IntentFilter,在過濾的時候只要有一個符合要求的癞尚,就會被視為過濾通過耸三。

那我們就看看是怎樣過濾的吧,首先我們應該明白一個大的思路:當我們隱式的啟動一個組件的時候,就會一個一個的去過濾對應組件的全部浇揩,(比如你是隱式的啟動一個Activity仪壮,就會一個一個的在全部Activity中篩選),然后根據(jù)Intent的所設置的action胳徽、category积锅、data去比較IntentFilter所設置的這三個屬性,相同的話就過濾留下來了养盗。

action的匹配#####

action的匹配要求Intent中的action存在且必須和過濾規(guī)則中的其中一個action相同

首先缚陷,action是一個字符串,匹配的話就是說兩個action的字符串完全相同(Intent和IntentFilter中的action)往核。然后我們就看看具體的匹配方法:

  • 如果IntentFilter中有action箫爷,Intent中必須有action
  • Intent中的action必須在相應IntentFilter中存在
  • Intent中只需要有一個actionIntentFilter中相同即可

IntentFilter中可以設置多個action,Intent中也可以設置多個action,這里就是說我們Intent中的action必須存在IntentFilter中聂儒,但是Intent中不必包括IntentFilter中全部的action虎锚,但是至少包括一個。

category的匹配#####

category 要求Intent中可以沒有category衩婚,但是你一旦有category窜护,不管幾個,每個都要和IntentFilter中的category相同非春。

這里我們說Intent中可以沒有category,其實不然柱徙,只是在我們啟動組件(eg:startActivity( ))的時候,默認給我們的Intent給加了一個category("android.intent.category.DEFAULT" ).

哦奇昙,我們知道了這里坐搔,那么匹配就和action差不多了,就是我們的Intent中的category必須在IntentFilter中存在敬矩。這里得注意,Intent中都會包括默認的category,并且如果你想隱式啟動某個組件蠢挡,那么就得在IntentFilter中添加android.intent.category.DEFAULT這個category才行喲弧岳。

data的匹配#####

如果IntentFilter中有定義data凳忙,那么Intent中也必須也要定義可以的date

看了上面的兩個的匹配規(guī)則,發(fā)現(xiàn)其實還是很有規(guī)律的禽炬,對的涧卵,data的匹配也差不多(其實我認為是一樣的,只是data的結構要復雜些)腹尖。

<data    android:mimeType="text/plain"
         android:host="www.mathiasluo.com"      
         android:path="/myfolder/my.txt"
         android:pathPattern="/myfolder/*" 
         android:port="80"
         android:scheme="http" />

一看柳恐,嚇死,這么多热幔。
但其實一個data主要包括的就是一個URImimeType乐设。mimeType就是媒體類型,就像"text/plain"這樣的绎巨,可以表示data是圖片呀近尚、文本呀、視頻等等场勤。其它的就是URI的了戈锻,簡單點,就是除開mimeType和媳,剩下的全部都是屬于URI的格遭,它們組成了URI。而URI中屬性就特別容易懂了留瞳,就像host指的是主機名拒迅、Scheme指的是URI的模式、Port指的端口號......

Inten中撼港,我們通過setDataAndType(Uri data, String type)方法對date進行設置坪它。這個方法接受兩個參數(shù),第一個就是URI,第二個就是String類型的mimeType了帝牡,通過這一個方法往毡,我們就可以給Intent設置data了。靶溜、


隱式啟動的判斷

當我們隱式啟動的時候开瞭,獲取無法過濾找到所需要的組件,這樣的話就會報錯了罩息。那么有沒有什么方法來判斷隱式啟動的Intent是否能找到相應的組件呢嗤详?
當然我們谷歌大法肯定是會知道我們的需求的。

Intent intent = new Intent();
intent.setAction(Intent.ACTION_BATTERY_LOW);
intent.addCategory(Intent.CATEGORY_APP_EMAIL);
intent.setDataAndType(Uri.EMPTY, "video/mpeg");
PackageManager packageManager = getPackageManager();
List<ResolveInfo> infoList = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
Log.i(TAG, infoList.size() + "");
if (infoList.size() != 0) {  
  startActivity(intent);
} else { 
   Log.e(TAG, "沒有匹配到Activity");
}

這里我們是通過PackageManager來判斷的瓷炮,還有一種Intent的方法:

Intent intent = new Intent();
intent.setAction(Intent.ACTION_BATTERY_LOW);
intent.addCategory(Intent.CATEGORY_APP_EMAIL);
intent.setDataAndType(Uri.EMPTY, "video/mpeg");
ComponentName name =  intent.resolveActivity(getPackageManager());
if (name != null){
    startActivity(intent);
}else {
    Log.e(TAG,"沒有匹配到Activity");
}

這兩個方法差不多葱色,也都很簡單,所以就不多說了娘香。


最后

還有苍狰,這些是我參考《Android開發(fā)藝術探索》的办龄,對,就是任大大的淋昭。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末俐填,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子翔忽,更是在濱河造成了極大的恐慌英融,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歇式,死亡現(xiàn)場離奇詭異驶悟,居然都是意外死亡,警方通過查閱死者的電腦和手機贬丛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門撩银,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人豺憔,你說我怎么就攤上這事额获。” “怎么了恭应?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵抄邀,是天一觀的道長。 經(jīng)常有香客問我昼榛,道長境肾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任胆屿,我火速辦了婚禮奥喻,結果婚禮上,老公的妹妹穿的比我還像新娘非迹。我一直安慰自己环鲤,他們只是感情好,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布憎兽。 她就那樣靜靜地躺著冷离,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纯命。 梳的紋絲不亂的頭發(fā)上西剥,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機與錄音亿汞,去河邊找鬼瞭空。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的匙铡。 我是一名探鬼主播图甜,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鳖眼!你這毒婦竟也來了?” 一聲冷哼從身側響起嚼摩,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤钦讳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后枕面,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愿卒,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年潮秘,在試婚紗的時候發(fā)現(xiàn)自己被綠了琼开。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡枕荞,死狀恐怖柜候,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情躏精,我是刑警寧澤渣刷,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站矗烛,受9級特大地震影響辅柴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瞭吃,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一碌嘀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧歪架,春花似錦股冗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惠呼,卻和暖如春导俘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背剔蹋。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工旅薄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓少梁,卻偏偏與公主長得像洛口,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子凯沪,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

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