Intent 背后的 Intent Filter

610 查看

如果 Intent 是对在某个数据集上执行的动作的请求,那么 Android 是如何知道使用哪个应用程序来响应这个请求的呢?使用 Intent Filter,应用程序可以声明他们支持的动作和数据。Intent Filter 提供了对 Intent 的拦截过滤,只有匹配上 Intent Filter 的应用程序组件,才能够对 Intent 造成响应。

要把一个 Activity 和 Service 注册成为一个能够处理 Intent 的程序,那么需要在它的 manifest 节点中添加 Intent Filter 标签。以下是相关属性介绍:

  • action 每个 Intent Filter 标签至少有一个 action 标签来描述动作名称。
  • category 包含哪种触发状态,一个动作下可以指定不同的处理动作目录的条件。例如:联系人 Actin 可以查看也可以修改。下面包含集中 Android 提供的服务,也可以自定义

    • ALTERNATIVE
    • SELECTED_ALTERNATIVE
    • BROWSABLE 基于浏览器内部的,在浏览器内部触发的 Intent 都会包含一个 BROWSABLE,所以想让指定的应用程序组件匹配到这个 Intent 必须要包含一个 BROWSABLE
    • DEFAULT 默认动作,对于显示调用的 Intent 很有必要
    • HOME 可以将 Intent Filter 的类别设置为 HOME,可以不指定 action
    • LAUNCHER 可以在应用程序启动器下显示
  • data

  • android:host
  • android:mimetype
  • android:path
  • android:port
  • android:scheme


Android 是如何解析 Intent Filter的

  1. Android 会将已安装包的可用的 Intent Filter 放到一个列表中
  2. 首先匹配 action 和 category,intent filter 必须要包含 intent 中所有的 category,不然匹配失败
  3. scheme、host、port、path、mimetype 都需要匹配一致
  4. 当隐式启动 Activity 时,如果解析出多个组件,那么所有的组件都会呈现城一个列表给用户。