Android – Intent 过滤器
前言
我们知道,Intent有两种启动方式,显式和隐式启动。显式启动去下:
|
|
显式启动没什么好说的,今天主要是说说隐式启动。一个简单的例子如下:
|
|
以上示例并没有明确指定要启动的组件,而是由系统决定。系统需要通过某种匹配规则来寻找需要启动的目标组件,这种匹配规则就依赖于Intent的过滤器实现。Intent过滤器是根据Intent中的动作(action)、类别(category)、数据(data)内容,对目标组件进行匹配和筛选的机制。当Intent匹配到一个过滤器上,系统就会启动相应的组件并传递给相应的Intent对象;如果匹配出了多个过滤器,系统会弹出对话框,由用户进行选择。下面就开始深入了解过滤规则。
由上面可知,我们知道Intent过滤器肯定要依附在Android组件上,我们看下最常见的MainActivity在Manifest中的注册:
|
|
在MainActivity中定义了一个Intent过滤器,Intent过滤器由 < intent-filter > 定义,在< intent-filter >中,可以定义以下三种标签:
通过 android : name 属性指定组件能相应的动作。
Action 常量 | 说明 |
---|---|
ANTION_VIEW | 最常用的动作,对以Uri传入的数据,根据协议部分以最佳方式启动 |
ANTION_MAIN | 应用程序入口 |
ANTION_CALL | 打开电话应用程序并把Uri的数据部分作为电话号码 |
ANTION_DIAL | 打开电话应用程序并显示Uri的部分数据作为电话号码 |
ANTION_SEND | 启动一个可以发送数据的Activity |
ANTION_EDIT | 打开一个Activity,对所提供的数据进行编辑操作 |
ANTION_PICK | 从列表中选择某项,并返回所选的数据 |
ANTION_CHOOSE | 显示一个Activity选择器 |
以上常量对应的值,通常就是 android.intent.action.XXX的类型。
- < data >
通过一个或多个属性来指定响应的 scheme , host , port , path 和 MIME type 等值。接受的是一个 Uri 对象。
- < category >
通过android:name属性指定组件能相应的服务方式,每个过滤器可以定义多个< category >标签。为了能够相应隐式启动,必须定义一个CATEGORY_DEFAULT。因为startActivity()和startActivityForResult()方法只有对具有该标签的过滤器进行解析,否则隐式启动永远无法启动对应组件。
Category 常量 | 说明 |
---|---|
CATEGORY_DEFAULT | Android系统中默认的执行方式,按照普通的Activity的执行方式执行 |
CATEGORY_HOME | 设置该组件随系统启动而运行 |
CATEGORY_PREFERENCE | 设置该组件为参数面板 |
CATEGORY_LAUNCHER | 设置该组件为当前应用程序启动器中优先级最高的Activity,通常和入口ACTION_MAIN配合使用 |
CATEGORY_BROWSABLE | 设置该组件可以使用浏览器启动 |
CATEGORY_TAB | 设置该组件为TabActivity的 |
CATEGORY_INFO | 用于提供包信息 |