IntentFilter的匹配规则

IntentFilter的匹配规则

IntentFilter中的过滤信息有action,category,data。只有同时匹配过滤表中的action、category、data信息,才算匹配成功。

一个过滤列表中的action、category和data可以有多个,所有的action、category、data分别构成不同的类别,同一类别的信息共同约束当前类别的匹配过程。只有一个Intent同时匹配action、category、data才算完全匹配,只有完全匹配才能成功启动目标
Activity。一个Activity可以有多个intent-filter,一个Intent只需要匹配其中一组intent-filter就可以成功启动对应的Activity。
Android 原生设置(Settings)的AndroidManifest.xml文件中有如下代码:


      
          
          
          
          
      
            
      
          
          
          
      

      


启动此Apn编辑界面,需要匹配其中任意一组intent-filter即可。

1.action的匹配规则
action是一个字符串,它的匹配规则是Intent中的action必须能够和过滤规则中的action匹配(字符串值完全相同)。一个过滤规则中可以有多个action,那么只要Intent中的action能够和过滤规则中的任何一个action相同即可匹配成功。
2.category的匹配规则
category是一个字符串,它的匹配规则是Intent中如果包含category,那么所有的category都必须和过滤规则中的其中一个category相同,即Intent中包含的category(可以为空,不包含category)是过滤规则category的子集。系统在调用startActivity或者startActivityForResult的时候会默认为Intent加上“android.intent.category.DEFAULT”这个category,同时,为了Activity能够接收隐式调用,就必须在intent-filter中指定“android.intent.category.DEFAULT”这个category。
3.data的匹配规则
data的匹配规则和action类似,要求Intent中必须含有data数据,并且data数据能够完全匹配过滤规则中的某一个data。这里的完全匹配是指过滤规则中出现的data部分,也出现在了Intent中的data中。
data的语法如下:


data由两部分组成,mimeType和URI。mimeType指媒体类型,比如image/jpeg、video/*等。URI包含的数据比较多,URI的结构如下:

://:/[||]
例如:
content://com.example.project:200/folder/subfolder/etc
http://www.baidu.com:80/search/info

其中,各部分的参数含义如下:
scheme URI的模式,例如http、file、content等。
host URI的主机名,例如www.google.com等。
port URI的端口号,例如80,只有当URI中指定了scheme和host参数的时候,port参数才有意义等。
path、pathPattern和pathPrefix 这三个参数表示路径信息,path表示完整的路径信息;pathPattern也表示完整的路径信息,但是可以包含通配符“*”,由于正则表达式的规范,如果想表示真是的字符串,需要将“*”写成“\\*”,"\",要写成“\\\\”,pathPrefix表示路径的前缀信息。

如果要为Intent指定完整的data,必须要调用setDataAndType方法。

有一类action和category比较重要,这两个共同作用来表示这是一个入口Activity,并且会出现在系统的应用列表中。

    
    

在通过隐式方法启动一个Activity的时候,需要增加判断,可以使用PackageManager的resolveActivity方法或者Intent的resolveActivity方法,如果找不到对应的Activity就会返回null,避免启动的Activity不存在引起程序崩溃。

你可能感兴趣的:(IntentFilter的匹配规则)