http://www.cnblogs.com/mengdd/archive/2013/03/18/2965839.html

Intent

Intent基本使用

  Intent可以理解为不同组件通信的媒介或者信使。

  Intent可以启动一个Activity,也可以启动一个Service,还可以发起一个广播Broadcast。

  具体方法如下表:

组件名称

方法名称

Activity

startActivity()

startActivityForResult()

Service

startService()

bindService()

Broadcasts

sendBroadcast()

sendOrderedBroadcast()

sendStickyBroadcast()

1.启动Activity:

  向Context.startActivity()或Activity.startActivityForResult()方法传递一个Intent对象,可以启动一个activity,或使得一个已经存在的activity去做一些新的事情。

  (也可以向Activity.setResult()去传递这个Intent对象,返回调用了startActivityForResult()的activity的一些信息。)

2.启动Service:

  向Context.startService()方法传递Intent对象可以初始化一个service或者向一个已经存在的service传递新的指令。

  类似的,向Context.bindService()方法传递Intent对象可以在调用所在的组件和目标service之间建立一种连接。如果这个service并没有开始运行,则它可以初始化这个service。

3.发起广播Broadcast

  可以向下面的广播方法传递Intent对象来发起广播:

  Context.sendBroadcast(),Context.sendOrderedBroadcast(), 或Context.sendStickyBroadcast()。系统会找到相应的广播接收者对此进行响应。

  

  Intent在寻找目标组件时有两种方法:

  第一种,显式调用,通过Component name直接指定;

  第二种,隐式调用,没有明确指定目标组件的名称,那么就要通过一定的条件过滤筛选。

  启动activity、service和broadcast的消息系统是没有任何重合的,即,一个要启动activity的Intent对象是绝对不会启动一个service的。

Intent对象构成

  Intent对象由以下六个部分组成:

  Component name

  Action

  Data

  Category

  Extras

  Flags

Component name

  Component name即组件名称,是要处理这个Intent对象的组件名称。

  组件名称对象由ComponentName类来封装,组件名称包含包名称类名称,被声明在AndroidManifest.xml文件中。

  组件名称通过setComponent(),)">setClass(),setClassName()设置,通过getComponent()获取。

  需要注意的是Component name是一个可选项,如果被设置,那么Intent对象就显式指定了要转向的组件,如果没有被设置,则Intent对象需要根据其他信息进行筛选查找。

Action

  Action是指Intent要完成的动作,是一个字符串常量。

  在Intent类里面定义了很多Action常量,其中有:

  Intent类中有很多预定义的常量,为了一些通常的动作;还有一些定义在Android API的其他地方。

  也可以自己定义Action常量,自定义的常量需要加上你的应用的包名作为前缀。

  Action在很大程度上决定了Intent的其他部分是如何构造的,尤其是data和extras域。(就好像函数名会决定着参数值和返回值一样。)所以Action的名字应该尽可能具体,并且它们应该和Intent中的其他域紧密结合。

  使用setAction()和getAction()来设置和读取Action属性。

Data

  Data属性是执行动作的URI和MIME类型,不同的动作有不同的数据规格。

  比如,Action是ACTION_EDIT时,数据域将是文档的URI;Action是ACTION_CALL时,数据域是tel:URI,带有要拨打的电话号码;如果Action是ACTION_VIEW,则数据域是http:URI。

  当匹配intent和能够处理intent所带的数据的组件时,知道数据类型(MIME类型)是很重要的。比如,一个展示图像的组件不应该被叫去播放一个音频。

  很多情况下,从URI可以看出数据类型,比如content: URIs,表示数据是在设备上,但是是由content provider控制。

  数据类型也可以显式指定,比如setData()方法指定数据为URI,setType()指定为MIME type,setDataAndType()指定它既为URI又为MIME type。读取的时候URI用getData(),MIME type用getType()。

Category

  Category是一个字符串,提供了额外的信息,有关于能够处理这个Intent对象的组件种类。

  一个Intent对象中可以包含任意数量的category描述信息。

  Intent类中也定义了一些Category常量:

  与category相应的方法有添加addCategory()、移除removeCategory()和获取所有categorygetCategories()。

Extras

  传递给Intent的额外数据,以Bundle的形式定义,就是一些键值对。就好像一些动作和特定的数据URI对应,一些动作和特定的extras对应。

  比如ACTION_TIMEZONE_CHANGED intent对象有一个"time-zone"的extra来确认新的时区;

  ACTION_HEADSET_PLUG有一个"state"extra表示耳机是否插入,还有一个"name" extra关于耳机类型;

  如果你要设计一个SHOW_COLOR动作,那么extra中应该包含颜色值。

  Intent对象有一系列的putXXX()函数用于放入各种数据类型,相应的也有一系列的getXXX()函数用于读取数据。

  实际上,数据可以被作为一个Bundle对象被使用,利用putExtras()和getExtras()方法。

Flags

  各种类型的Flag。很多是用来指定Android系统如何启动activity,还有启动了activity后如何对待它。所有这些都定义在Intent类中。

更多相关文章

  1. 【Android】ArrayList通过remove方法删除元素对象源码分析
  2. Android之AppWidget的按钮事件开启Activity
  3. Android标准调用播放器流程
  4. Android(安卓)退出功能
  5. 深入理解 Android(安卓)中的各种 Context
  6. android通过MediaProjectionManager录屏关联MediaCodec获取h264
  7. Android学习笔记(24):进度条组件ProgressBar及其子类
  8. Android通过Apache HTTP访问HTTP资源
  9. 详解React Native开源时间日期选择器组件(react-native-datetime

随机推荐

  1. Android--自定义带提示文本的EditText组
  2. Android(安卓)textview获取选中的内容
  3. android Activity 清空焦点
  4. Android学习笔记(27):日历视图Calendar
  5. Android 定时/倒计时工具 - 加强版 CountD
  6. eclipse上Android NDK开发环境搭建
  7. Android(安卓)获取年月日时分秒 格式化指
  8. Android 他人面试题总结
  9. android 城市列表
  10. Android中的开机和关机广播