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的更多相关文章

  1. Android学习笔记之Intent(2)

    打开网页 package com.jiahemeikang.helloandroid; import java.io.File; import com.jiahemikang.service.Echo ...

  2. Android学习笔记之Intent(1)

    1.Intent指定启动目标组件 2.Intentfilter描述基本组件所在地址 3.其他包引入资源文件时记得引入R所在的包 package com.jikexueyuan.intent; impo ...

  3. Android学习笔记之Intent

    Intent是Activity之间的管道 可以用来做Acitivity的跳转或传递数据 protected void onCreate(Bundle savedInstanceState) { sup ...

  4. 【转】Pro Android学习笔记(十二):了解Intent(下)

    解析Intent,寻找匹配Activity 如果给出component名字(包名.类名)是explicit intent,否则是implicit intent.对于explicit intent,关键 ...

  5. 【转】Pro Android学习笔记(十):了解Intent(上)

    目录(?)[-] Intent基本含义 系统的Intent Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Servic ...

  6. Android学习笔记(一)

    目录 Android学习笔记(一) 一.JDK.Android SDK 二.部分项目结构 三.字符串引用 四.外层build.gradle详解 五.app->build.gradle详解 六.日 ...

  7. Android学习笔记之Activity详解

    1 理解Activity Activity就是一个包含应用程序界面的窗口,是Android四大组件之一.一个应用程序可以包含零个或多个Activity.一个Activity的生命周期是指从屏幕上显示那 ...

  8. 【转】 Pro Android学习笔记(七五):HTTP服务(9):DownloadManager

    目录(?)[-] 小例子 保存在哪里下载文件信息设置和读取 查看下载状态和取消下载 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csd ...

  9. 【转】 Pro Android学习笔记(五七):Preferences(1):ListPreference

    目录(?)[-] 例子1ListPreference小例子 定义一个preferences XML文件 继承PreferenceActivity 用户定制偏好的读取 第一次运行时设置缺省值 设置Cat ...

随机推荐

  1. Ionic基础——侧边栏ion-side-menus 以及ion-tap结合侧边栏详解

    一. 侧边栏菜单 : ion-side-menus 侧边栏菜单是一个最多包含三个子容器的元素: 默认情况下,侧边栏菜单将只显示ion-side-menu-content容器的内容. 向左滑动时,将显示 ...

  2. Angular 通过 $http.post 写入本地 JSON 文件

    最近在练习使用 Angular,在实现 $http 对本地 JSON 文档读写的时候遇到了问题. 问题 使用 GET 方法成功将 JSON 文档的内容读出来:但是在使用 POST 插入本地 JSON ...

  3. js如何把字符串转换成json数据的方法

    js如何把字符串转换成json数据的方法 function strtojson(str){ var json = eval('(' + str + ')'); return json; } 方法二 f ...

  4. android中的Handler

    android的Handler   前言 学习android一段时间了,为了进一步了解android的应用是如何设计开发的,决定详细研究几个开源的android应用.从一些开源应用中吸收点东西,一边进 ...

  5. 改造dede 后台会员目录

    可以在后台目录(默认 dede),里面的inc->inc_menu.php 文件里进行添加或更改,实现功能!

  6. 学生管理系统-火车订票系统 c语言课程设计

    概要: C 语言课程设计一---学生管理系统 使使用 C 语言实现学生管理系统.系统实现对学生的基本信息和考试成绩的 管理.采用终端命令界面,作为系统的输入输出界面.采用文件作为信息存储介质. 功能描 ...

  7. 【BZOJ1007】【HNOI2008】水平可见直线

    依旧看黄学长代码,不过这回是看完后自己写的 原题: 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.例 ...

  8. Linux驱动设计——字符设备驱动(一)

    Linux字符设别驱动结构 cdev结构体 struct cdev { struct kobject kobj; struct module *owner; const struct file_ope ...

  9. 安卓应用运营知识:VersionCode和VersionName

    本文转载于:http://blog.sina.com.cn/s/blog_580a227a0101bdzb.html 小米应用商店运营了大概半年了,过程中有喜有泪,我们在运营过程中,发现有的运营和商务 ...

  10. EXTJS 5.0 资料

    http://blog.csdn.net/sushengmiyan/article/category/2435029