Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Activity intent-flilter過濾機制

Android Activity intent-flilter過濾機制

編輯:關於Android編程

在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設置帶統配符的路徑,通配符為“*”和“.*”,其中“*”和正則表達式中的“*”一樣,表示前一個字符為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(默認)才能被其他應用調用。

















  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved