股票场内基金交易,没时间盯盘?
介绍
Intent 的中文释义是“意图”,顾名思义它是 Android 提供的一种用于组件间传递消息的系统。系统会把 intent 发送给所有应用程序的符合条件的组件,收到 intent 的组件会根据其中包含的数据执行动作。
使用范围
Android 向我们提供了以下几个方法用于分派 intent:
1 2 3 4 |
startActivity(intent); startService(intent); sendBroadcast(intent); |
而它们都是 ContextWrapper 及其子类的方法,也就是说平时只有 Activity 和 Service 才能够发送 intent,且只有 Activity / Service / BroadcastReceiver 可以接收到 intent。
显式与隐式
显式 Intent
在发送 intent 前需要调用 intent 的方法设置对象中包含的数据,这时调用以下方法可以指定接收 intent 的目标:
1 2 3 4 |
Intent.setComponent() Intent.setClassName() Intent.setClass() |
通过设置一个明确的组件类作为目标,发送 intent 的方式称为显式 Intent 或直接 Intent。
隐式 Intent
如果无法直接指定需要接收 intent 的那个类,那么 Android 会根据 intent 中设置好的 Action / Category / Type 来寻找合适的组件来处理 intent。
属性
Intent 类提供了修改其对象属性的方法,向这些方法提交的参数将决定 intent 会被哪些组件接收,以及希望接收者执行哪些动作:
Action
Action 代表 intent 希望接收者完成的动作。每个 intent 只能包含一个 action。它可以是 Intent 类的任意一个以 Action_ 开头的常量,例如 Intent.ACTIONVIEW 和 Intent.ACTIONCALL,也可以是其他任何字符串,只要保证这个值能被接收到 intent 的组件接受。自定义的 Action 最好使用基于 Java 包的命名方式,例如 “android.intent.action.CALL” 这样格式的字符串。
Category
Category 则用于添加附加的类别信息。如果我们使用 addCategory() 向 intent 中添加了 Intent.CATEGORYAPPBROWSER 和 Intent.CATEGORYAPPMUSIC 两个常量,那么组件要想接收到这个 intent,它的 Intent Filter(意图过滤器)中就必须至少有这两个值。
Data
Data 存储的是需要传递给接收者的数据,格式为 Uri,常见的使用方式如下:
1 2 3 4 5 |
Intent intent = new Intent(); intent.setAction("android.intent.action.CALL"); intent.setData(Uri.parse("tel:10086")); startActivity(intent); |
运行上面的代码会拨打10086,其中冒号前的字符指定了数据类型为 tel。
Type
当没有设置 Data 的值时,Type 设置的值才会有效,这时系统将 Type 的值作为数据的类型。
Extra
这个属性的类型为 Bundle,类似 Map 类,可以存入多对键值,通常用于 Activity 之间进行数据交换。
Intent Filter
能够为其他组件的动作请求提供服务的组件想要接收 intent,就需要在其 manifest 节点内添加一个 intent-filter 标签。通过为其添加合适的子元素可以达到过滤收到的 intent 的效果, intent 只有通过了 intent-filter 的以下三种过滤才会被该组件接收到。
动作过滤
intent-filter 应该包含至少一个 action 子标签,否则就无法收到任何 intent。如果 intent 中没有设置 action,那么只要 intent-filter 包含有任何 action 子标签,该 intent 就可以通过动作过滤。
1 2 3 4 5 6 |
<intent-filter> <action android:name="com.example.project.SHOW_CURRENT"/> <action android:name="com.example.project.SHOW_RECENT"/> <action android:name="com.example.project.SHOW_PENDING"/> </intent-filter> |
类别过滤
类别过滤与动作过滤类似,不同的是没有 category 子标签的 intent-filter 仍可以接收到没有设置 category 的 intent。
1 2 3 4 5 |
<intent-filter> <category android:name="android.Intent.Category.DEFAULT"/> <category android:name="android.Intent.Category.BROWSABLE"/> </intent-filter> |
数据过滤
数据过滤使用 data 标签指定希望接受的 intent 的数据URI和数据类型。
URI被分成三部分来进行匹配:scheme、 authority 和 path
data 元素通过设置属性来进一步过滤 intent。这些属性是可选的,但也是相互依赖的。如果没有给 Intent 过滤器指定 scheme 属性,那么所有其他的 URI 属性都会被忽略。如果没有给过滤器指定 host 属性,那么 port 属性和所有的路径属性都会被忽略。
包含在同一个 intent-filter 元素中所有的 data 元素只会对这个过滤器起作用,例如:
1 2 3 4 5 |
<intent-filter . . . > <data android:scheme="something" android:host="project.example.com" /> . . . </intent-filter> |
等同于
1 2 3 4 5 6 |
<intent-filter . . . > <data android:scheme="something" /> <data android:host="project.example.com" /> . . . </intent-filter> |
android:host
这个属性用户定义 URI 授权的主机部分,除非给过滤器也指定了 data 元素的 scheme 属性,否则这个属性没有意义。
android:mimeType
这个属性用于设定数据的 MIME 类型,如:image/jpeg 或 audio/mpeg4-generic。其子类型可用(*)通配符来代替,指示能够跟任何子类型匹配。
android:path
android:pathPrefix
android:pathPattern
以上三个属性用于指定 URI 的路径部分。Path 属性指定一个完整的路径,这个路径会跟 Intent 对象中的路径进行匹配。PathPrefix 属性只指定了部分路径,它会跟 Intent 对象中的路径初始部分匹配。pathPattern 属性指定一个要跟 Intent 对象中的路径进行匹配的完整路径,但是这个路径中可以包含下列通配符:
- 星号(*)通配符,路径中的*星号代表任意多个星号之前的那个字符,如 ba*b,可跟bab、baab、baaab、baaaab 等字符串匹配。
- 点跟星号的组合(.*)通配符,它可以跟任意字符串进行匹配,如 .*html,可以跟 abchhtml、chtml、html、dssf.html 等字符串匹配。
因为系统读取 XML 中的字符串时,会把 ”\” 符号作为强制转义字符,因此就需要两次转义。例如,符号 ”*” 要被写成 ”\*” ,符号 ”\” 要被写成 ”\\”。这与 Java 代码中的写法基本相同。有关这三种模式的更多信息,请看 PatternMatcher 类中的 PATTERNLITERAL、PATTERNPREFIX、PATTERNSIMPLEGLOB 的说明。
android:port
这个属性用于定义 URI 授权的端口部分。只有给过滤器指定了 scheme 和 host 属性时,这个属性才有意义。
android:scheme
这个属性用于设定 URI 的 scheme 部分。它是指定 URI 设置的最基本的属性,至少要给过滤器设置一个 scheme 属性,否则,其他 URI 属性就没有意义。scheme属性值没有 ”:” 符号结尾(如:“http”,而不是“http:”),如果过滤器有一个数据类型(设置了 mimeType 属性),但没有设置 scheme 属性,那么系统就会假定 scheme 是 “content:” 和 “file:”
注意:在 Android 框架中,以上大部分属性匹配时大小写敏感的,跟RFC格式不一样。因此,要始终使用小写字母来指定属性的值。
参考
作者学习 Android 开发时日尚浅,如有错误欢迎指正,本文撰写过程中参考了以下文章:
Intent filter 关于Action、Category属性详解—附带实例源码
想获得去掉 5 元限制的证券账户吗?

如果您想去掉最低交易佣金 5 元限制,使用微信扫描左边小程序二维码,访问微信小程序「优财助手」,点击底部菜单「福利」,阅读文章「通过优财开证券账户无最低交易佣金 5 元限制」,按照文章步骤操作即可获得免 5 元证券账户,股票基金交易手续费率万 2.5。
请注意,一定要按照文章描述严格操作,如错误开户是无法获得免 5 元证券账户的。