android学习日记20--连接组件之Intent和IntentFilter
上次刚了解完Android的四大组件,现在学习组件间通信的Intent和IntentFilter
一、Intent
1、简述
Intent(意图)在应用程序运行时连接两个不同组件,是一种运行时的绑定机制。一般应用是通过Intent向Android系统
发出某种请求,根据查询各个组件声明的IntentFilter,找到组件并运行它。
2、使用机制
前面介绍的四大组件中的Activity、Services、BroadcasReceiver的通信全部使用的是Intent,但是各个组件
使用Intent的机制不同。
a、Activity
当需要激活一个Activity组件时,需要调用Context.startActivity或Context.startActivityForResult方法来传递Intent
b、Service
当需要启动或绑定一个Service组件时,会通过Context.startService和Context.bindService方法实现Intent的传递
c、BroadcastReceiver
通过Context.sendBroadcast()、sendOrderBroadcast()或sendStickyBroadcast()方法传递的,当BroadcastIntent被广播后,
所有IntentFilter过滤条件满足的组件将被激活。
在以上的三种情况下,当Intent被传递出后,Android系统会找到适合的activity,service,或者是多个broadcast receiver去响应这个intent。
这三种情况不会存在重叠的部分,它们相互独立,互不干扰。
3、组成要素
Intent是由组件名称、Action、Data、Category、Extra及Flag六部分组成的。
a、组件名称
实际上就是一个ComponentName对象,用于标识唯一的应用程序组件,即指明期望的Intent组件,
它是目标的组件的完整限定名(包名+类名) 例如: "com.android,.test.TestActivity",该字段是可选的
如果没有写,Android要通过IntentFilter(相当于过滤器,后面详细介绍),比较intent对象和组件关联结构去选择相应的组件,
所以组件名称为空的也要写IntentFilter。
可以通过 setComponent() , setClass() 或者 setClassName()进行设置。 可以通过 getComponent() 进行读取
b、Action
表示所触发动作名称的常量字符串,Android已定义的如下图:

开发人员也可以自定义Action,自定义的action 应该包含包名作为前缀: 例如"com.example.project.SHOW_COLOR"
c、Data
主要是对Intent消息中数据的封装,主要描述Intent的动作所操作到的数据URI和类型,不同类型的Action会有不同Data的封装,
例如打电话的Intent的动作会封装tel://格式的电话URI,而ACTION_VIEW的Intent中Data则会封装http:格式的URI。正确的Data封装对Intent匹配请求同样非常重要
d、Category
是对目标组件类别信息的描述,同样是常量字符串。一个Intent中可以包含多个Category。与Category相关的方法有三个,addCategory()、removeCategory()、getCategorys()
Android已定义的如下图:

e、Extra
封装一些额外的附加信息,这些信息是以键值对形式存在的。Intent可以通过putExtras()、getExtras()方法来存储和获取Extra。
f、Flag
有关系统如何启动组件的标志位。
二、IntentFilter
为了能支持隐式Intent(即组件名称为空),需要声明IntentFilter。它的使用方法非常简单,仅声明该应用接收什么样的Intent请求即可。
IntentFilter过滤Intent时,一般通过Action、Data及Category三个进行测试:
a、Action测试
一个Intent只能设置一种Action,但是一个IntentFilter却可设置多个Action过滤。当IntentFilter设置多个Action时,只需一个满足即可完成验证。
如果Intent中没有包含Action、只要IntentFilter中含有Action时,便可以成功,反过来IntentFilter中没有任何Action,所有Intent都不能通过测试。
b、Data测试
包含两部分,即数据的URI和数据类型,而数据URI又被分成三部分进行匹配(Schema://host:port/path),只有指定的这些全部匹配时,Data测试才会成功
c、Category测试
IntentFilter同样可以设置多个Category,当Intent中的Category与IntentFilter中的一个Category完全匹配时,便会通过Category的测试,
Filter可以列出额外的category,但是不能漏掉 Intent 对象包含的任意一个Category,但当IntentFilter没有设置Category时,只能和没有设置Category的Intent相匹配。
原则上,一个没有任何categorys的 Intent将总是通过此测试。大多数情况下是正确的。然而也有例外,android对待所有传入startActivity()中的隐式视图
都认为它们至少包含了一个"android.intent.category.DEFAULT". . 因此,希望接收这些隐式意图的activities必须在在它们的 intent filters 中包含
”android.intent.category.DEFAULT” 有(对于含"android.intent.action.MAIN" and "android.intent.category.LAUNCHER"的filter 则是例外。
因为它们标记了此activity开启了一个新的task和将出现在 auncher screen。它们也可以包含“com.intent.category.DEFAULT”,但没必要)
android学习日记20--连接组件之Intent和IntentFilter的更多相关文章
- android学习日记05--Activity间的跳转Intent实现
Activity间的跳转 Android中的Activity就是Android应用与用户的接口,所以了解Activity间的跳转还是必要的.在 Android 中,不同的 Activity 实例可能运 ...
- android学习日记03--常用控件Dialog
常用控件 9.Dialog 我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框 对话框,要创建对话框之前首先要创建Bui ...
- android学习日记03--常用控件checkbox/radiobutton
常用控件3.checkbox 复选框,确定是否勾选,点击一下勾选,点击第二下取消,当有一系列备选项时适合用checkbox控件,方便用户提交数据. 贴上例子Activity的java代码 packag ...
- android学习日记03--常用控件button/imagebutton
常用控件 控件是对数据和方法的封装.控件可以有自己的属性和方法.属性是控件数据的简单访问者.方法则是控件的一些简单而可见的功能.所有控件都是继承View类 介绍android原生提供几种常用的控件bu ...
- Android学习笔记(十一) Intent
一.Intent对象的基本概念 -Intent是Android应用程序组件之一 -Intent对象在Android系统当中表示一种意图 -Intent当中最重要的内容是action与data 二.In ...
- Android学习记录(7)—Intent中显示意图和隐式意图的用法
Intent(意图)主要是解决Android应用的各项组件之间的通讯. Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行描述,Android则根据此Intent的描述,负责找到对应的 ...
- Android应用程序组件之间的通信Intent和IntentFilter
Android应用程序的基本组件,这些基本组建除了Content Provider之外,几乎全部都是依靠Intent对象来激活和通信的. 下面介绍Intent类,并通过例子来说明Intent一般用法 ...
- 【Android学习日记】
(一) Android 开发基础 1 Android平台的特性 1) 应用程序框架支持组建的重用和替换,包括打电话应用程序.文件管理器等. 2) Dalvik虚拟机专门为移动设备做了优化,Dalv ...
- Android学习系列(20)--App数据格式之解析Json
JSON数据格式,在Android中被广泛运用于客户端和网络(或者说服务器)通信,非常有必要系统的了解学习. 恰逢本人最近对json做了一个简单的学习,特此总结一下,以飨各位. 为了文 ...
随机推荐
- Repeater实例应用
在实际开发过程中,涉及到数据绑定,分页,以及一对多展示数据时,遇到这样的需求我们怎么解决呢?下面以帖子展示来逐一说明. 帖子主要由两部分组成,第一部分是发帖人的原创内容部分,第二部分是用户评论部分,这 ...
- 关闭 VS的实时调试器
可以这样关闭: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger HKEY_LOCAL_ ...
- 【转】COCOS2D-X之CCHttpRequest下载图片Demo
#include "pthread.h" #pragma comment(lib,"libcurl_imp.lib") #pragma comment(lib, ...
- linux下socket keep alive讲解
[需求] 不影响服务器处理的前提下,检测客户端程序是否被强制终了.[现状]服务器端和客户端的Socket都设定了keepalive属性.服务器端设定了探测次数等参数,客户端.服务器只是打开了keepa ...
- memcache 存储单个KEY,数据量过大的时候性能慢!以及简单的memcache不适合用到的场景
今天有人问到我:memcache存储大数据量,10K,100K,1M的时候,效果怎么样??我回答:不好,效果非常慢.对方问:为什么啊??我回答不上来...于是就找了点资料. memcached使用需要 ...
- 【mongodb 学习一】环境搭建之 mac 下连接 mongodb 的UI 客户端
记录下 mongodb 的学习 懒得自己达 mongodb 的服务器了 虽然一句命令就能搞定了 brew install mongodb 可是考虑到以后的应用还是放在网上的,就直接用现成的服务吧 下载 ...
- 【译】 AWK教程指南
前面的话: 这几天写了一个程序,在同一个目录里生成了很多文件,需要统计其中部分文件的总大小,发现经常用到的ls.du等命令都无济于事,我甚至都想到了最笨的方法,写一个脚本:mkdir一个新目录,把要统 ...
- Stm32 SWD 下载 调试配置
找到一篇比较好的 关于stm32 SWD模式 下载 调试 配置文章 整理如下: 我们比较常用的是Jlink下载器 ,这种下载器有一个缺点就是使用的Jtag 20PIN接口,太多的PIN会 ...
- wuzhicms 自定义SQL 标签
{wz:sql sql="select * from wz_guestbook"} {loop $rs $r} {$r[title]} {/loop} {/wz} 自定义统计条数: ...
- HTTP 报文总结、外送两本电子书
写在前面的话:喜欢这个比喻:如果说HTTP是因特网的信使,那么HTTP报文就是它用来搬东西的包裹. HTTP是一个应用层协议,研究它的内容的确很枯燥,没啥意思,都是规定好的,我们只需要知道是什么就好了 ...