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

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

这种情况下,只有当intent对象的URI匹配到了intent-filter中的URI格式,并且intent-filter没有指定MIME类型的时候才能通过data测试。需要注意的是,这里所说的intent-filter没有指定MIME类型的情形指的是intent-filter中所有的<data />标签都没有指定MIME类型,即整个intent-filter中完全没有android:mimeType这几个字,理解这点很重要,大家在下面的几个示例中可以体会到这点。 
例如有如下intent对象:

Intent intent = new Intent();
intent.setAction("com.ispring.action.ACTION_TEST1");
Uri uri = Uri.parse("ispring://blog.csdn.net/sunqunsunqun");
intent.setData(uri);

上面的intent能通过如下的intent-filter的data测试:

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

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

<intent-filter>
 <action android:name="com.ispring.action.ACTION_TEST1" />
 <category android:name="android.intent.category.DEFAULT" />
 <data android:scheme="ispring" android:host="blog.csdn.net" />
 <data android:scheme="sunqun" android:host="8080" />
</intent-filter>

intent对象虽然不能通过scheme为sunqun的<data />标签测试,但是可以通过scheme为ispring的data标签测试,且intent对象和intent-filter中的两个<data />标签都没有指定MIME,所以上面的intent对象可以通过该intent-filter测试。

上面的intent对象无法通过以下intent-filter的<data />标签测试:

<intent-filter>
 <action android:name="com.ispring.action.ACTION_TEST1" />
 <category android:name="android.intent.category.DEFAULT" />
 <data android:mimeType="text/plain" android:scheme="ispring" android:host="blog.csdn.net" />
</intent-filter>