Intent到Intent过滤器的映射过程称为“Intent解析”。Intent解析可以在所有组件中找到一个可与请求的Intent达成佳匹配的Intent过滤器。
Intent解析的匹配规则。
Android系统把所有应用程序包中的Intent过滤器集合在一起,形成一个完整的Intent过滤器列表。
在Intent与Intent过滤器进行匹配时,Android系统会将列表中所有Intent过滤器的“动作”和“类别”与Intent进行匹配,任何不匹配的Intent过滤器都将被过滤掉。没有指定“动作”的Intent过滤器可以匹配任何的Intent,但没有指定“类别”的Intent过滤器只能匹配没有“类别”的Intent。
把Intent数据Uri的每个子部与Intent过滤器的<data>标签中的属性进行匹配,如果<data>标签指定了协议、主机名、路径名或MIME类型,那么这些属性都要与Intent的Uri数据部分进行匹配,任何不匹配的Intent过滤器均被过滤掉。
如果Intent过滤器的匹配结果多于一个,则可以根据在<intent-filter>标签中定义的优先级标签来对Intent过滤器进行排序,优先级高的Intent过滤器将被选择。
在此以6.2.1节中隐式启动Activity的例子WebViewIntentDemo为基础,在AndroidManifest.xml文件中注册Intent过滤器,以及设置<intent-filter>节点属性来捕获指定的Intent。
在AndroidManifest.xml中添加如代码清单6-19所示。
代码清单6-19 AndroidManifest.xml中添加代码
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<data android:schema="http" />
</intent-filter>
利用 <intent-filter> 可以把应用程序的操作注册到系统中,当用户调用 Intent 时,可以根据输入的 ACTION 和 Uri参数来找到这个应用程序。例如,在上述代码中,以 http 协议为例,打开 Google Map 可以用 URI: geo:38.899533,-77.036476。
此外,“协议”在 Android 里都可以随便定义。例如,写一个打开文件的关联 Intent,如 file:///sdcard/abc.txt。也可以用 type进行关联,其代码如代码清单6-20所示。
代码清单6-20 用type进行关联
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<type android:value="test.item"/>
</intent-filter>
然后,通过代码清单6-21所示代码就能定位到应用。
代码清单6-21 用 type 定位到应用代码
Intent it = new Intent(Intent.ACTION_VIEW);
it.setType("test.item”);
startActivity(it)