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

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

如果intent-filter中同时指定了scheme、authority和path,那么只有具有相同scheme、authority和path的URI才能匹配到该intent-filter。
需要注意的是,intent-filter的<data />标签在指定path的值时,可以在里面使用通配符*,起到部分匹配的效果。

data测试需要同时将intent对象中的URI、MIME类型与intent-filter的<data />标签中指定的URI、MIME类型进行对比。 
我们知道一个intent-filter下可以有多个<data />标签,intent对象无需通过所有的<data />标签测试,一般情况下,我们的intent对象只需通过了其中一个<data />标签的测试并满足某些特定情形下的一些条件,那么该intent对象就通过了该intent-filter的data测试。 
进行对比的规则分以下几种情况:

  • intent对象不包含URI和MIME类型

    这种情况下,只有当intent-filter也没有指定任何URI和MIME类型的时候才能通过data测试。 
    例如我们有如下intent对象:

    Intent intent = new Intent();
    intent.setAction("com.ispring.action.ACTION_TEST1");
    
    

    上面的intent对象可以通过下面的intent-filter的data测试:

    <intent-filter>
     <action android:name="com.ispring.action.ACTION_TEST1" />
     <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    
    

    上面的intent对象无法通过下面的intent-filter测试:

    <intent-filter>
     <action android:name="com.ispring.action.ACTION_TEST1" />
     <category android:name="android.intent.category.DEFAULT" />
     <data android:scheme="ispring" />
    </intent-filter>