详解Android中Intent对象与Intent Filter过滤匹配过程

2019-12-10 19:42:54于海丽

<intent-filter>
 <data android:mimeType="video/mpeg" android:scheme="http" ... />
 <data android:mimeType="audio/mpeg" android:scheme="http" ... />
 ...
</intent-filter>

每个<data />标签都可以指定一个URI结构以及data的MIME类型。一个完整的URI由scheme、host、port和path组成,其结构如下所示:

<scheme>://<host>:<port>/<path>

其中scheme既可以是Android中常见的协议,也可以是我们自定义的协议。Android中常见的协议包括content协议、http协议、file协议等,自定义协议可以使用自定义的字符串。

  • 如下是一个content协议的URI:

    content://com.example.project:200/folder/subfolder/etc 
    在该URI中,scheme是content,host是com.example.project,port是200,path是folder/subfolder/etc。

    • 如下是一个自定义协议的URI:

      ispring://blog.csdn.net/sunqunsunqun 
      在该URI中,scheme是ispring,host是blog.csdn.net,没有明确设定port,path是sunqunsunqun。

      组成URI的这些属性在<data />标签中都是可选的 ,但存在如下的依赖关系:

      • 如果没有指定scheme,那么host参数会被忽略
      • 如果没有指定host,那么port参数会被忽略
      • 如果scheme和host都没有指定,path参数会被忽略

        当我们将intent对象中的Uri参数与intent-filter中的<data />标签指定的URI格式进行对别时,我们我们只对比intent-filter的<data />标签指定的部分,例如:

        如果intent-filter中只指定了scheme,那么所有带有该sheme的URI都能匹配到该intent-filter。
        如果intent-filter中只指定了scheme和authority(authority包括host和port两部分)而没有指定path,那么所有具有相同scheme和authority的URI都能匹配到该intent-filter,而不用考虑path为何值。