先附上Activity常用的flags:
Flag_Activity_New_TASK:指定"singleTask"啟動模式洲敢,效果與xml里指定相同椰棘。
Flag_Activity_SINGLE_TOP:指定"singleTop"模式捏萍,同上漂佩。
Flag_ACTIVITY_CLEAR_TOP:同任務(wù)棧中所有位于它之上的Activity全部出棧咒锻。一般配合singleTask(默認此效果)使用(調(diào)用onNewIntent),如果啟動模式是"standard"模式啟動比规,那么該包括自己和他之上Activity全部出棧,再重新創(chuàng)建該實例入棧讥邻。
Flag_ACTIVITY_EXCLUDE_FROM_RECENTS:此標記Activity不會出現(xiàn)在歷史列表中迫靖,在某些情況中如果不希望用戶通過歷史列表返回到該Activity比較有用,等同于xml里"android:excludeFromRecents=true"兴使。
啟動Activity分顯示和隱式兩種系宜,原則上一個intent不該既是顯示調(diào)用又是隱式調(diào)用,如果兩者共存发魄,以顯示調(diào)用為主盹牧。隱式調(diào)用需要通過intent去匹配目標組件的IntentFilter中所設(shè)置的過濾信息,如果不匹配励幼,目標Activity無法啟動汰寓。
IntentFilter有action,category,data三種苹粟。
IntentFilter中action有滑,category,data可以有多個,所有的action嵌削,category,data分別構(gòu)成不同類別毛好,同一類別共同約束當前類別匹配過程。
一個Activity中可以有多個intent-filter,而一個Intent只要能匹配任何一組intent-filter即可掷贾。
action匹配規(guī)則:action是一個字符串睛榄,系統(tǒng)預(yù)定義了一些action,應(yīng)用中也可以自定義action想帅。
Intent的action必須和intent-filter里的action完全匹配场靴,如果intent-filter里有多個action,那么Intent里的action只要能完全匹配任意一個即可。
注:action字符串區(qū)分大小寫。
category匹配規(guī)則:category是一個字符串旨剥,系統(tǒng)預(yù)定義了一些category咧欣,應(yīng)用中也可以自定義category。
與action不同的時轨帜,Intent中如果含有category,那么所有的category必須和intent-filter里的其中一個category相同魄咕。即Inten里出現(xiàn)了category,不管有多少個蚌父,所有的category必須和intent-filter里定義的category哮兰。
Intent里可以沒有category,如果沒有按上面的定義也可以匹配成功苟弛,這是因為系統(tǒng)會默認為Intent加上"android.intent.category.DEFAULT"這個category(注:如果Intent里沒用category而又想隱式調(diào)用的話喝滞,必須在intent-filter里定義"android.intent.category.DEFAULT"這個category)。
data的匹配規(guī)則與action類似膏秫,不過結(jié)構(gòu)比較復(fù)雜右遭。
data由兩部分組成:mimeTyoe(?媒體類型),URI(包含數(shù)據(jù)較多)
URL構(gòu)成:
Scheme:URL的模式缤削,比如http,file,content等窘哈。如果URL里沒指定,整個URL的其它參數(shù)無效亭敢,這也意味URL無效滚婉。
Host:URL的主機名,比如www.baidu.com帅刀,如果Host未指定满哪,整個URL的其它參數(shù)無效,這也意味URI無效劝篷。
Port:URI的端口號,比如80民宿,僅當URL中指定了Scheme和Host參數(shù)后娇妓,Port才是有效的。
Path,pathPatterm和pathPrefix:這三個參數(shù)表示路徑信息活鹰,path表示完整路徑信息哈恰;pathPatterm也表示路徑完整信息,但是它可以包含通配符"",""表示0個或多個任意字符(注:由于正則表達式的規(guī)范志群,如果想表示真實的字符串""要寫成"\",""要寫成"\\");pathPrefix表示路徑的前綴信息着绷。
舉例:
<intent-filter>
<data android:mimeType="image/*"/>
</intent-filter>
該規(guī)則指定了媒體類型為所有類型圖片,那么Intent中的mimeType必須為"image/*"才能匹配锌云。注:此時URI的默認值為content和file荠医。所以intent里URI的schema必須為content或file才能匹配。
Intent intent = new Intent();
intent.setDataAndType(Uri.parse("file://abc"),"image/png");
注:如果為intent指定完整data,必須調(diào)用setDataAndType。不能先調(diào)用setData再調(diào)用setType彬向,因為這兩個方法會彼此清除對方的值兼贡。
intent-filter的匹配規(guī)則對Service和BroadcastReceiver同樣使用,不過系統(tǒng)推薦對于Service盡量使用顯示調(diào)用娃胆。
最后遍希,當隱式調(diào)用啟動Activity時候,最好做一下判斷是否有Activity能匹配隱式啟動里烦,如果不做判斷會拋出異常:
判斷方法有兩種:
PackagerManager的resolveActivity或IntentresolveActivity方法凿蒜。如果沒有匹配的返回值為null.另PackagerManager的queryIntentActivitys方法則返回的成功匹配的Activity信息。
PackagerManager兩個方法需要的flags要使用MATCH_DEFULT_ONLY這個標記胁黑。這個標記含義是僅匹配intent-filter里的android.intent.category.DEFAULT"這個category废封,意義在于只要返回值不為null,那么啟動一定會成功别厘。