Android Intent Filter 简析

在 Activity 和 Service 中,Intent 代表了对某个数据集上执行动作的请求,Intent Filter 则声明了一个特定的应用程序组件能够对一个类型的数据进行操作

要把一个Acitivty或者service注册为一个可能的Intent处理程序,可以再它的mainfest节点中添加一个intent-filter标签并使用以下的标签

  • action 使用android:name属性制定要为之服务的动作的名称。每个Intent Filter必须要有至少一个action标签,action应该是一个描述性的唯一的字符串,所以最好的做法是使用基于Java的包名约定的命名系统
  • category 使用 android:name属性来制定应该在哪个情况下为action提供服务,每个Intent Filter标签都可以包含多个category标签,既可以制定自己的标签,也可以使用以下Android提供的标签:

    • ALTERNATIVE 可以把这个动作指定为在特定数据类型上执行的默认动作的可选项,例如一个联系人的默认动作是查看其信息,可选的动作则是对其进行编辑
    • SELECTED_ALTERNATIVE 与 ALTERNATIVE 类似,但是 ALTERNATIVE 总是使用后面描述的intent resolution 解析为一个动作,二档要求有很多种可能性的时候,则可以使用 SELECTED_ALTERNATIVE
    • BROWSABLE 指定一个在浏览器内部可用的动作。当一个Intent在浏览器内部触发时,它总是会包含 BROWSABLE 类别,如果想让应用程序响应浏览器内部触发的动作,例如 截获指向特定网站的链接,则必须包含 BROWSABLE 类别。
    • DEFAULT 通过设置这个类型可以使用一个组件成为Intent Filter内指定的数据类型的默认动作。对于那些使用一个现实的Intent自动的Activity,这个类型是很有必要的
    • HOME 通过将一个Intent Filter的类别设置为HOME,而不指定一个action,则可以把它作为本地屏幕的可选项
    • LAUNCHER 使用这个类别会让一个Activity出现在应用陈旭的自启动器中
  • data data 标签允许制定组件可以执行的数据类型,可以使用一下属性的任意组合来指定你的组件中所支持的数据:

    • android:host 制定一个有效的主机名,如google.com
    • android:mimetype 制定组件可以执行的数据类型,如将匹配所有的Android cursor
    • android:path 制定URI的有效路径值 如.transport/boats/
    • android:port 制定主机的有效窗口
    • android:scheme 要求一种特定的模式 如 content or http

Android 如何解析 Intent Filter

当在startActivity 中传入一个隐式的Intent时,决定启动哪一个Activity的过程就叫做Intent解析,intent解析的目的是使用一下步骤来找出最匹配的Intent Filter

  1. Android 将已安装包的可用Intent Filter 放到一个列表中
  2. 那些与解析Intent时相关联的action或者category不匹配的Intent Filter将会从列表中移除
    • 如果Intent Filter 包含了指定的action,则可认为action匹配了,如果没有检查到任何一个action和Intent制定的action相匹配,则认为action匹配失败了
    • 对于category 匹配来说,Intent Filter 必须包含待解析的Intent中的所有category,但可以包含 Intent 中所不包含的其他category,一个没有制定category的Intent Filter只能和没有任何category的Intent相匹配
  3. Intent 的数据URI的每一个部分都和Intent Filter的data标签进行比较,如果Intent Filter制定了scheme、host/authority、path或者是MIME类型,那么这些值都要和Intent的URI比较,任意一个不匹配都会把Intent Filter从列表中移除,没有制定数据值的Intent Filter将会和所有的Intent数据值匹配,这一点个category不一样,需要注意

    • MIME 类型是值要匹配的数据的数据类型,当匹配数据类型时,可以使用通配符来匹配子类型,如earthquake/*。如果Intent Filter 制定了一种数据类型,那么它必须匹配该Intent,如果不指定数据类型,则它会匹配所有的Intent
    • scheme 是URI的协议部分,如http: tel:
    • hostname 或者是data authority 是URI位于scheme 和path之间的部分,如 developer.android.name ,hostname想要匹配,Intent Filter的scheme必须也要匹配
    • 数据path是authority之后的内容,例如 /training。只有数据的scheme和hostname都匹配的时候,path才能匹配
  4. 当隐式启动一个Activity的时候。如果这个进行解析出多个组件,那么所有可能匹配的组件都会呈现给用户。

传递责任

可以使用startNextMatchingActivity 方法将处理action的责任传递给下一个最佳匹配的Activity

Intent intent = getIntent();
if(ifDuringBreak)
{
	startNextMatchingActivity(internt);
}


你可能感兴趣的:(android,filter,intent)