在Intent中如果不使用ComponentName属性明确设置一个组件,那么这个Intent将是一个隐式意图,需要通过Intent的Action、Category、Data三个属性联合匹配,才可以确定对这个Intent进行处理的组件。这三个属性可以在清单文件AndroidManifest.xml中,使用<intent-filter…/>元素,为某个组件设置。<intent-filter…/>元素,即为意图过滤器。每个意图过滤器指定当前组件可以接受的行为、类别、数据。
意图过滤器可以匹配Action、Category、Data这三个属性,在<intent-filter…/>中也提供了相应的元素对其进行设置,分别是:
· <action>:声明这个组件可以完成什么行为,通过它的android:name属性设置。在一个意图过滤器中,只能为当前意图设置一个<action>元素。
· <category>:指定这个组件接受的意图类别,通过它的android:name属性进行设置。在同一个意图过滤器中,可以设置多个<category>元素。
· <data>:指定这个组件可以接受的数据类型,在同一个意图过滤器中,可以设置0~N个<data>元素。
Intent封装的标准Category属性(CATEGORY_DEFAULT),这个属性在自定义的意图过滤器中,必须配置。因为Intent默认包含此类型,如果不对其进行配置,系统将无法通过一个Intent来匹配此组件。
一些组件可以根据不同需要完成不同的功能实现,例如:某图片查看器组件可以查看图片或者进行绘图,而对于同一个组件,如何区分何时使用其查看图片,何时使用其进行绘图呢?在清单文件中配置组件的意图过滤器的时候,可以对同一个组件配置多个<intent-filter…/>元素,使其通过不同的意图过滤器进行匹配,处理不同的逻辑。
通过Action、Category、Data这三个属性配置的隐式过滤器,需要同时匹配Android系统上所有与这三个属性均匹配的组件,如果有一个属性得不到匹配,Android系统也会认为这个组件无法处理这个Intent,将把它排除在外。
既然配置的意图过滤器,就可以通过隐式意图来访问它,那么在同一系统中,对于外部应用而言,如果知道了它的过滤器的参数,就可以通过隐式意图来使用这个组件。但是在某些情况下,还要保证配置的意图过滤器无法被外部应用访问到,这时可以在配置组件的时候,设置其android:exported属性为false。