Android -Intent
来源:互联网 发布:mac软件安装其它盘 编辑:程序博客网 时间:2024/05/21 23:00
一、Intent是什么
1、定义
Intent被译作意图,其实还是很能传神的,Intent期望做到的,就是把实现者和调用者完全解耦,调用者专心将以意图描述清晰,发送出去,就可以梦想成真,达到目的。
这个解释还是有点不太好理解,下面还有一个:Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来完成请求。比如,有一个Activity希望打开网页浏览器查看某一网页的内容,那么这个Activity只需要发出WEB_SEARCH_ACTION给Android,Android就会根据Intent的请求内容,查询各组件注册时声明的IntentFilter,找到网页浏览器的Activity来浏览网页。 这个解释好像理解起来就容易好多,我们通过intent传入某种意图,而android就会根据这种意图,自动寻找合适的activity来启动,如果有多个条件符合的activity,就以列表的方式让用户手动选择一个。
2、显示Intent与隐式Intent
这两个概念刚开始不太好理解,先看两个通过intent启动activity的代码:
例一:
例二:从这两段代码中可以明显看出,同样是startActivity,但第一个明确指出是启动OtherActivity,而在第二个例子中,并没有明确指出要启动哪个activity!
这两种书写方式就分别是显示Intent(例一)、隐式Intent(例二);
- 显式intent是指明确指出此intent是启动哪个activity.
- 隐式intent是指并没有指出要启动哪个activity,而要系统自动去判断并启动匹配的activity.
3、显式Intent小结
有两种方式来显示的指示要启动的Activity:
方式一:(通过setClassName)
同样,setClass(Context packageContext, OtherActivity.class);是指启动packageContext包里的OtherActivity.class类;
二、针对隐式intent,Activity的匹配原则
上面我们讲了隐式intent是要靠系统自动去匹配并启动某个activity的。那系统是怎样匹配activity的呢,系统是怎样知道这个actitiy就是某个intent想要的呢。
某个activity能不能被某个intent激活,要看这个activity是不是符合这个intent的要求,而某个activity能被哪个intent激活是有定义的,定义就在AndroidManifest.xml
打开AndroidManifest.xml,找到任意一个activity,一般都能看到一段代码,举个例子,我随便复制一个,如下:
看这里有一对标签<intent-filter>……</intent-filter>在这个标签里定义的所有东东都是用来定义该activity可以被哪些intent激活的,如果匹配,就会被激活!!!!!
在<intent-filter>里有以下几个属性可以让intent来匹配:Action、Category、Data;下面逐一介绍:
1、Action:该activity可以执行的动作
该标识用来说明这个activity可以执行哪些动作,所以当隐式intent传递过来action时,如果跟这里<intent-filter>所列出的任意一个匹配的话,就说明这个activity是可以完成这个intent的意图的,可以将它激活!!!!
常用的Action如下所示:
两条原则:- 一条<intent-filter>元素至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配。
- 如果Intent请求的Action和<intent-filter>中个任意一条<action>匹配,那么该Intent就可以激活该activity(前提是除了action的其它项也要通过)。
如果Intent请求或<intent-filter>中没有说明具体的Action类型,那么会出现下面两种情况。
- 如果<intent-filter>中没有包含任何Action类型,那么无论什么Intent请求都无法和这条<intent-filter>匹配。
- 反之,如果Intent请求中没有设定Action类型,那么只要<intent-filter>中包含有Action类型,这个Intent请求就将顺利地通过<intent-filter>的行为测试。
2、Category:于指定当前动作(Action)被执行的环境
即这个activity在哪个环境中才能被激活。不属于这个环境的,不能被激活。
常用的Category属性如下所示:
注意:如果该activity想要通过隐式intent方式激活,那么不能没有任何category设置,至少包含一个android.intent.category.DEFAULT
3、Data 执行时要操作的数据
在目标<data/>标签中包含了以下几种子元素,他们定义了url的匹配规则:
- android:scheme 匹配url中的前缀,除了“http”、“https”、“tel”...之外,我们可以定义自己的前缀
- android:host 匹配url中的主机名部分,如“google.com”,如果定义为“*”则表示任意主机名
- android:port 匹配url中的端口
- android:path 匹配url中的路径
在XML中声明可以操作的data域应该是这样的:
注意:这个标识比较特殊,它定义了执行此Activity时所需要的数据,也就是说,这些数据是必须的!!!!!所有如果其它条件都足以激活该Activity,但intent却没有传进来指定类型的Data时,就不能激活该activity!!!!
三、Intent隐式传递方法
上面我们讲了一个Activity能被某隐式Intent唤醒的原则,只有这些全部匹配的intent才能唤醒这个Activity,下面我们就讲讲怎么向隐式intent传递这些参数,以便与activity匹配将向唤醒。
1、Action
使用Intent的一个构造方法即可实现传递Action参数:
对于有如下声明的Activity:要激活这个Activity,就需要如下这样构造Intent:(直接向intent中传递action的name值)这样就可以启动我们上面的这个activity了。
注意这里再次提醒,一个activity可以有多个action,只要有一个匹配就可以被启动。同样,如果仅指定某个action,而多个activity都具有这个action的话,系统会列出列表供用户选择执行哪一个activity.
2、Category
一个intent对象可以有任意个category。intent类定义了许多category常数.- addCategory()方法为一个intent对象增加一个category,
- removeCategory删除一个category,
- getCategories()获取intent所有的category.
3、Data
有两种传递data的方式:
第一种:利用构造函数:
第二种:利用Intent::SetData(URI uri)举个例子:(改动下上面的action的例子)这个时候如果要启动这个TargetActivity只指定action就不够了,我们需要为其设置data值,如下:此时,url中的每个部分和TargetActivity配置信息中全部一致才能跳转成功,否则就被系统拒绝。
注意:
不过有时候对path限定死了也不太好,比如我们有这样的url:(scott://com.scott.intent.data:7788/target/hello)(scott://com.scott.intent.data:7788/target/hi)
这个时候该怎么办呢?我们需要使用另外一个元素:android:pathPrefix,表示路径前缀。我们把android:path="/target"修改为android:pathPrefix="/target",然后就可以满足以上的要求了。
4、Extras
这个参数不参与匹配activity,而仅作为额外数据传送到另一个activity中,接收的activity可以将其取出来。这些信息并不是激活这个activity所必须的。也就是说激活某个activity与否只上action、data、catagory有关,与extras无关。而extras用来传递附加信息,诸如用户名,用户密码什么的。可通过putXX()和getXX()方法存取信息;也可以通过创建Bundle对象,再通过putExtras()和getExtras()方法来存取。
通过bundle对象传递
发送方
接收方:更多参数传递方法见《通过Intent传递类对象》
5、附《Intent调用常见系统组件方法》
至此本文就结束了。
下一篇用简单的几个实例,来具体讲解隐式intent的匹配与调用原理。
参考文章 :
《Android中Intent组件详解》
《android Intent机制详解》
《基础总结篇之九:Intent应用详解》
《Intent详解》
《Intent总结》
《Intent中的四个重要属性——Action、Data、Category、Extras》
请大家尊重原创者版权,转载请标明出处:http://blog.csdn.net/harvic880925/article/details/38399723 不胜感激!!!!!!
- Android intent intent-filter
- Android intent intent-filter
- Android intent intent-filter
- Android intent
- Android Intent
- Android Intent
- android Intent
- android intent
- android intent
- android intent
- Android------Intent
- android Intent
- Android Intent
- android intent
- Android Intent
- android intent
- Android Intent
- android --------intent
- 字符排序
- 排序算法_0,桶排序
- 解决Linux网卡由eth0变为eth1的问题
- arcgis for android 基础底图
- 故事中的酒---我依旧在古楼
- Android -Intent
- 【TLE】10123UVa不要歪(贪心)
- C Primer Plus (第五版) 第五章 编程练习 答案
- Mysql (二)
- TF-IDF算法
- 串的简单处理
- 自定义加载动画的效果
- 用javascript实现win7系统扫雷游戏
- 通达oa破解版/通达oa破解版下载/通达oa2017破解版