Android Activity intent-flilter過濾機制
在Android中一個應用(APP1)如果要想調用另一應用的(APP2)的某一個Activity(Activity2),就需要在給Intent設定的參數能夠通過Activiy2 在資訊清單檔中聲明的屬性驗證,才能成功調用到Activity。 標籤中可以使用的驗證有:Action驗證、Category驗證、Data驗證,其中Action驗證是必須聲明的。
Action 驗證:
一個Activity可以聲明多個Action,在驗證時只要通過一個即通過驗證,如果Activity2聲明如下3個Action:
…………
其他的應用可以通過給Intent設定Action方法調用到Activity2(如果系統中其他應用也有相同的Action,會進行列表供使用者選擇),如:
Intent intent=new Intent();intent.setAction("ACTION1");startActivity(intent);
Category驗證:
Activity2的還可以聲明多個Category驗證,如下(其中DEFAULT那個是系統會自動添加的,及時沒聲明還是會存在的):
在其他應用中可以為Intent添加Category,當所添加的Category都在Activity2有聲明是就會通過驗證,如下Intent就能通過驗證:
Intent intent=new Intent(); intent.setAction("ACTION1"); intent.addCategory("CATEGORY1"); intent.addCategory("CATEGORY3"); startActivity(intent);
Data驗證:
Data驗證比較複雜點,可以驗證Intent中設定的Mime Type和Uri。Mime Type可以指定處理的資源類型,如“audio/*”表示所有音頻資源,設定MimeType:
調用的Intent 可以通過setType()或者setTypeAndNormalize()設定Mime Type,
Intent intent=new Intent(); intent.setAction("ACTION1"); intent.setType("audio/*"); // intent.setTypeAndNormalize("audio/*"); startActivity(intent);
Uri比較Url範圍廣,格式為:scheme://host:port/path,其中scheme為協議標識如:http等,host為IP、網域名稱等,port為連接埠號碼,path為路徑。在的中可以對這個幾個分別進行設定驗證,但是不能跳躍設定,例如設定了scheme,不設定host,直接設定port,這時port的設定將會被忽略,跟沒設定port一樣。在設定path,可以使用path設定整個路徑,也可以使用pathPrefix設定路徑以什麼開頭,還可以使用pathPattern設定帶統配符的路徑,萬用字元為“*”和“.*”,其中“*”和Regex中的“*”一樣,表示前一個字元為0或任意多個,而“.”表示任一字元。如果“abc*d”可以匹配 “abcccd”,“abcd”等,“abc.*d”可以匹配“abced”,“abcfd”等。在中的設定Uri格式如下:
相應的調用Intent可以如下:
Intent intent=new Intent(); intent.setAction("ACTION1"); Uri uri=Uri.parse("http://www.google.com:8080/abc.jsp");//匹配path // Uri uri=Uri.parse("http://www.google.com:8080/index.jsp");//匹配pathPrefix // Uri uri=Uri.parse("http://www.google.com:8080/idexn");//匹配pathPattern intent.setData(uri); startActivity(intent);
但是,需要注意的是Intent的setData()方法和setType()會相互覆蓋,也就是說,如果先使用setType()設定了Mime Type,之後在使用setData()設定了Uri,那麼原先設定的MimeType就會被清空,反之也相同。以下為setData()方法源碼,看了就很容易理解了:
public Intent setData(Uri data) { mData = data; mType = null; return this;}
如果一個Activity的的中mimeType和Uri都設定了,那就需要使用Intent的setDataAndType(Uridata, String type)進行設定咯。
總結下,如果一個Activity在中聲明了Action驗證、Category和Data驗證,那麼另一個應用要想通過隱式調用這個Activity,就必須在給Intent設定正確的參數,只有全部通過驗證才能調用到這個Activity。還有一個需要注意的是,被調用的Activity的exported8屬性需要設定為true(預設)才能被其他應用調用。