android学习笔记29——Intent/IntentFilter
Intent/IntentFilter
Intent封装android应用程序需要启动某个组件的“意图”,Intent还是应用程序组件之间通信的重要媒介。
EG:Activity之间需要交换数据时,使用封装的Bundle对象,Intent来携带Bundle对象。
Intent可用于启动android应用中的Activity,Service、BroadCastReceiver.
使用Intent启动不同组件的方法如下:
| Activity |
startActivity(Intent intent) startActivityForResult(Intent intent,int requestCode) |
| Service |
ComponentName startService(Intent service) boolean bindService(Intent service,ServiceConnection conn,int flags) |
| BroadCastReceiver |
sendBroadCast(Intent intent) sendBroadCast(Intent intent,String receiverPermission) sendOrderedBroadCast(Intent intent,String receiverPermission,BroadCastReceiver resultReceiver,Handler scheduler,int initialCode,String initialData,Bundle initialExtras) sendOrderedBroadCast(Intent intent,String receiverPermission) sendStickyBroadCast(Intent intent) sendStickyOrderedBroadCast(Intent intent,BroadCastReceiver resultReceiver,Handler scheduler,int initialCode,String initialData,Bundle initialExtras) |
Intent对象包含的属性:
Component(用于明确指定需要启动的目标组件)、Action、Data、Category、Extra(用于携带数据)、Flag
Component==>
Intent的属性Component属性需要接受一个ComponentName对象,该对象包含如下几个构造器:
| ComponentName(String pkg,String cls) | 创建pkg所在包下的cls类所对应的组件 |
| ComponentName(Context pkg,String cls) | 创建pkg所对应包下的cls类对应的组件 |
| ComponentName(Context pkg,Class<?>cls) | 春创建pkg所对应的包下的cls类所对应的组件 |
启动方式如下:
等价于==》
注意:启动后,如果需要在被启动的Activity获取启动Activity的相关信息,可使用如下方式进行获取:
ComponentName comp = getIntent.getComponent();
comp.getPackageName();
comp.getClassName();
Action、Category、intent-filter
Intent的Action、Category属性都是一个普通的字符串,Action代表Intent所要完成的一个“抽象”动作,Category则用于为Action增加额外的附加信息。
通常Action、Category属性会结合使用。
注意:
一个Intent最多只能有一个Action属性,通过setAction(string str)进行设置;
但一个Intent可以包含多个Category属性,通过addCategory(string str)添加属性。
EG:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_GET_CONTENT);// 设置Action属性
intent.setType("vnd.android.cursor.item/phone");// 设置Intent的Type属性
startActivityForResult(intent, PICK_CONTACT);// 启动Activity,并希望获取到该Activity的结果
Action要完成的只是一个抽象动作,这个动作具体有那个组件来完成,Action这个字符串本身并不管。
EG:android提供的标准Action:Intent.Action_VIEW,只是表示一个抽象的查看操作,但具体查看什么、启动那个Activity来查看,Intent.Action_VIEW并不知道——其取决于Activity的<intent-filter>配置,
只要某个Activity的<intent-filter.../>配置中包含了该Action_VIEW,该Activity就可能被启动。
<intent-filter.../>元素是AndroidMainfest.xml文件中<activity.../>元素的子元素,<activity.../>元素用于为应用程序配置Activity;<intent-filter.../>用于配置该Activity所能响应的Intent.
<intent-filter.../>通常可包含如下子元素:
1.0——N个<action.../>子元素
2.0——N个<category.../>子元素
3.0——N个<data.../>子元素
注意:当<intent-filter>子元素里包含多个<action>子元素——表明该Activity能响应Action属性值为其中任何一个字符串的Intent.
当程序创建Intent时,该Intent默认启动Category属性值为Intent.CATEGORY_DEFAULT(android.intent.category.DEFAULT)常量的组件.
用法一:

如上图,代码中并未指定目标Intent的Category属性,但该Intent默认已有一个值为android.intent.category.DEFAULT的Category属性值,因此
被启动Activity对应的配置元素<intent-filter>中至少包括一个如下<category.../>子元素:

用法二:
代码设置:

配置方式:

指定Action、Category调用系统Activity
android内部提供了大量标准Action、Category常量,其中常用的用于启动Activity的标准Action常量以及对应字符串如下所示:
| ACTION_MAIN | android.intent.action.MAIN | 应用程序入口 |
| ACTION_VIEW | android.intent.action.VIEW | 显示指定数据 |
| ACTION_ATTACH_DATA | android.intent.action.ATTACH_DATA | 指定某块数据被附加到其他地方 |
| ACTION_EDIT | android.intent.action.EDIT | 编辑指定数据 |
| ACTION_PICK | android.intent.action.PICK | 从列表中选择某项并返回所选的数据 |
| ACTION_CHOOSER | android.intent.action.CHOOSER | 显示一个Activity选择器 |
| ACTION_GET_CONTENT | android.intent.action.GET_CONTENT | 让用户选择数据,并返回所选数据 |
| ACTION_DIAL | android.intent.action.DIAL | 显示拨号界面 |
| ACTION_CALL | android.intent.action.CALL | 直接向其他用户打电话 |
| ACTION_SEND | android.intent.action.SEND | 向其他人发送数据 |
| ACTION_SENDTO | android.intent.action.SENDTO | 向其他人发送消息 |
| ACTION_ANSWER | android.intent.action.ANSWER | 应答电话 |
| ACTION_INSERT |
android.intent.action.INSERT |
插入数据 |
| ACTION_DELETE | android.intent.action.DELETE | 删除数据 |
| ACTION_RUN | android.intent.action.RUN | 运行数据 |
| ACTION_SYNC | android.intent.action.SYNC | 执行数据同步 |
| ACTION_PICK_ACTIVITY | android.intent.action.PICK_ACTIVITY | 用于选择Activity |
| ACTION_SEARCH | android.intent.action.SEARCH | 执行搜索 |
| ACTION_WEB_SEARCH | android.intent.action.WEB_SEARCH | 执行Web搜索 |
| ACTION_FACTORY_TEST | android.intent.action.FACTORY_TEST | 工厂测试的入口点 |
标准Category常用的常量以及对应的字符串如下所示:
| CATEGORY_DEFAULT | android.intent.category.DEFAULT | 默认的Category |
| CATEGORY_BROWSABLE | android.intent.category.BROWSABLE | 指定该Activity能被浏览器安全调用 |
| CATEGORY_TAB | android.intent.category.TAB | 指定Activity作为TabActivity的Tab页 |
| CATEGORY_LAUNCHER | android.intent.category.LAUNCHER | Activity显示顶级程序列表中 |
| CATEGORY_INFO | android.intent.category.INFO | 用于提供包信息 |
| CATEGORY_HOME | android.intent.category.HOME | 设置该Activity随系统启动而运行 |
| CATEGORY_PREFERENCE | android.intent.category.PREFERENCE | 该Activity是参数面板 |
| CATEGORY_TEST | android.intent.category.TEST | 该Activity是一个测试 |
| CATEGORY_CAR-DOCK | android.intent.category.CAR-DOCK | 指定手机被插入汽车底座(硬件)时运行该Activity |
| CATEGORY_DESK_DOCK | android.intent.category.DESK_DOCK | 指定手机被插入桌面底座(硬件)时运行该Activity |
| CATEGORY_CAR_MODE | android.intent.category.CAR_MODE | 设置该Activity可在车载环境下使用 |
Data、Type属性与intent-filter配置
Data属性通用用于向Action属性提供操作的数据,Data属性接受一个Uri对象,一个Uri对象通常通过如下形式的字符串表示:
content://com.android.contacts/contacts/1
tel:123
content、tel表示的是数据类型,而其后信息表示数据内容。
一个合法的Uri对象即可决定操作那种类型的数据,也可指定具体的数据内容。
Type属性,这用于明确指定Data数据的类型或MIME类型,Eg:指定“cnd.android.cursor.item/phone”字符串。
通常来说,Intent不指定Data属性时Type属性才会其作用,否则android系统会根据Data属性值来分析数据类型,因此无须指定Type属性。
实际上Data属性值可分为两个部分:数据类型和数据部分。
Eg:
content://com.android.contacts/contacts/1
1.content:前缀:该前缀表明数据类型为联系人信息
2.//com.android.contacts/contacts/1:该数据表明操作_id为1的联系人数据
一旦Intent同时指定了Action、Data属性,android将可根据指定的数据类型来启动特定的应用程序,并对指定数据执行响应的操作。
下面是几个Action属性、Data属性的组合:
| ACTION_VIEW content://com.android.contacts/contacts/1: | 显示标识为1的联系人信息 |
| ACTION_EDIT content://com.android.contacts/contacts/1: | 编辑标识为1的联系人信息 |
| ACTION_DIAL content://com.android.contacts/contacts/1: | 显示向标识为1的联系人的拨号界面 |
| ACTION_VIEW tel:123: | 显示向指定号码123拨号的界面 |
| ACTION_DIAL te:123: | 显示向指定号码123拨号的界面 |
| ACTION_VIEW content://contacts/people/: | 显示所有联系人列表的信息 |
| ..... | ..... |
通过这种组合方式非常方便的可以查看系统联系人信息。
Eg:



Extra属性
Extra属性通用用于多个Action之间进行数据交换,Intent的Extra属性值应该是一个Bundle对象,Bundle对象就像一个Map对象,其可存入多组key-value对,
这样可以通过Intent在不太Activity之间进行数据交换。
使用Intent创建Tab页面
TabActivity,可参考:http://www.cnblogs.com/YYkun/p/5761041.html


android学习笔记29——Intent/IntentFilter的更多相关文章
- Android学习笔记之Intent(2)
打开网页 package com.jiahemeikang.helloandroid; import java.io.File; import com.jiahemikang.service.Echo ...
- Android学习笔记之Intent(1)
1.Intent指定启动目标组件 2.Intentfilter描述基本组件所在地址 3.其他包引入资源文件时记得引入R所在的包 package com.jikexueyuan.intent; impo ...
- Android学习笔记之Intent
Intent是Activity之间的管道 可以用来做Acitivity的跳转或传递数据 protected void onCreate(Bundle savedInstanceState) { sup ...
- 【转】Pro Android学习笔记(十二):了解Intent(下)
解析Intent,寻找匹配Activity 如果给出component名字(包名.类名)是explicit intent,否则是implicit intent.对于explicit intent,关键 ...
- 【转】Pro Android学习笔记(十):了解Intent(上)
目录(?)[-] Intent基本含义 系统的Intent Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Servic ...
- Android学习笔记(一)
目录 Android学习笔记(一) 一.JDK.Android SDK 二.部分项目结构 三.字符串引用 四.外层build.gradle详解 五.app->build.gradle详解 六.日 ...
- Android学习笔记之Activity详解
1 理解Activity Activity就是一个包含应用程序界面的窗口,是Android四大组件之一.一个应用程序可以包含零个或多个Activity.一个Activity的生命周期是指从屏幕上显示那 ...
- 【转】 Pro Android学习笔记(七五):HTTP服务(9):DownloadManager
目录(?)[-] 小例子 保存在哪里下载文件信息设置和读取 查看下载状态和取消下载 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csd ...
- 【转】 Pro Android学习笔记(五七):Preferences(1):ListPreference
目录(?)[-] 例子1ListPreference小例子 定义一个preferences XML文件 继承PreferenceActivity 用户定制偏好的读取 第一次运行时设置缺省值 设置Cat ...
随机推荐
- 解决Eclipse Pydev中import时报错:Unresolved import
在安装 图像处理工具包 mahotas 后,在eclipse中尝试import mahotas时,出现Unresolved import错误,按快捷无法自动生成代码提示 但是,程序运行时可以通过,在命 ...
- Qt 串口学习2
未命名 (2) 1 新建串口 //new serial portmy_serialport= new QSerialPort(); 2给串口设定名字 my_serialport->setPort ...
- Web端文件打包.zip下载
使用ant.jar包的API进行文件夹打包.直接上代码: String zipfilename = "test.zip"; File zipfile = new File(zipf ...
- 转:Struts标签checkbox使用总结(默认选择设置)
在使用struts标签html:checkbox 的时候,如何让checkbox框默认是选中的,一般情况 下都是当formbean里面该property的值和标签上value给定的值相等的时候,生成的 ...
- tulterbot遥感操作使用Interactive Markers--12
原创博客:转载请表明出处:http://www.cnblogs.com/zxouxuewei/ 1.安装ros indigo功能包: sudo apt-get install ros-indigo-t ...
- ✡ leetcode 160. Intersection of Two Linked Lists 求两个链表的起始重复位置 --------- java
Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...
- Python学习(5)——内置函数
常用字符串内置函数 1)str.count() //返回该字符串中某个子串出现的次数 2)str.find() //返回某个子串出现在该字符串的起始位置 3)str.lower() //将该字符串全部 ...
- Linux系统编程@进程管理(二)
1.创建守护进程(Deamon) 守护进程的概念与作用 后台服务程序 – 系统服务,进程名字往往以’d’结尾,生存周期比较长(系统装入时启动,关闭时候终止.系统装入两种启动方式:1从启动脚本.etc/ ...
- MySQL-python模块
1. Python 操作 Mysql 模块的安装 linux: pip install MySQL-python 或 yum -y install MySQL-python windows: exe ...
- JAVA 新闻
Oracle已对Java失去兴趣?Java社区能否扭转乾坤? http://news.cnblogs.com/n/549566/ http://mp.weixin.qq.com/s?__biz=MjM ...