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

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

对于MIME测试:如果intent的MIME类型能够匹配intent-filter中列出的某一个<data />标签中的MIME类型值,那么MIME类型测试就通过了。
对于URI测试: 
又细分两种情况,满足下面的任何一种情况都可以通过URI测试。 
如果intent的URI格式能够匹配intent-filter中列出的某一个<data />中的URI,那么URI测试就通过了。
如果intent的URI是content:协议或file:协议,并且整个intent-filter的所有<data />标签中都没有指定URI,那么该intent也能通过URI测试。换句话说,如果一个intent-filter只列出了MIME类型,没有列出任何URI相关的格式的话,那么这个intent-filter就默认是支持content:协议或file:协议的。
下面举几个例子大家自己体会一下。

假设有如下协议为自定义协议ispring:的intent对象:

Intent intent = new Intent();
intent.setAction("com.ispring.action.ACTION_TEST1");
Uri uri = Uri.parse("ispring://blog.csdn.net/sunqunsunqun");
String type = "text/plain";
intent.setDataAndType(uri, type);

上面的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:mimeType="text/plain" />
</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" android:port="8080" />
  <data android:mimeType="text/plain" />
</intent-filter>