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

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

Category测试

为了指定能够接收并处理的Intent的类型,组件可以在intent-filter中声明其支持0个或多个category,例如:

<intent-filter>
 <category android:name="android.intent.category.DEFAULT" />
 <category android:name="android.intent.category.BROWSABLE" />
 ...
</intent-filter>

intent对象有addCategory()方法,也就是说一个intent对象也可以关联多个category。为了能让intent对象通过intent-filter的category测试,intent对象中的所有category都要在intent-filter中找到对应项。 
具体来说,又分为如下两种情况:

  • intent对象至少有一个category

    这种情况下,假设intent对象有N个category(N >=1),那么intent-filter中必须要包含这N个category,intent对象才能通过category测试,否则无法通过测试。如果用intent对象启动Activity,还有其他限制条件,会在后面详细说明。 
    举个例子,假设我们的intent-filter如下所示:

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

    以下intent对象能够通过category测试

    Intent intent = new Intent();
    intent.setAction("com.ispring.action.ACTION_TEST1");
    intent.addCategory("com.ispring.category.TEST1");
    intent.addCategory("com.ispring.category.TEST2");
    
    

    该intent对象之所以可以通过category测试是因为intent-filter包含了该intent对中所有的category值:com.ispring.category.TEST1”和com.ispring.category.TEST2。