刚接触Intent时可能会从字面意思上理解它:意图、目的;所以你可能会感到困惑。当你用过多次Intent对象之后,你可能会这样理解它:Intent绑定了一次操作,负责携带这次操作所需要的数据和这次操作的类型。
与Intent密切相关的是IntentFilter(Intent过滤器)。
一般Activity、Service和BroadcastReceiver可以有一个或多个IntentFilter,IntentFilter描述了这个组件想要接收怎样的Intent,在Androidmanifest.xml中通过<intent-filter>标签来为组件添加IntentFilter,通过<action>、<category>、<data>等元素来过滤Intent。
一个Intent对象其实就是一堆信息的捆绑,它包含六个部分,接下来详细说明这6个部分:
1、组件名称
组件名称是可选的,如果设置了组件名称,则Intent对象会传递到指定的类;如果没有设置,则在AndroidManifest.xml中通过IntentFilter来找出与该Intent最合适的组件。
组件名称通过setComponent()、setClass()或者setClassName()来设置,通过getComponent()方法获取。
2、动作Action
将被执行的动作的字符串命名,Intent类定义了一些动作常量
常量 | 目标组件 | 动作 |
ACTION_CALL | Activity | 发起电话呼叫 |
ACTION_EDIT | Activity | 为用户显示要编辑的数据 |
ACTION_MAIN | Activity | 作为一个任务的初始Activity启动,没有数据输入和返回输出。 |
ACTION_SYNC | Activity | 用移动设备上的数据同步服务上的数据。 |
ACTION_BATTERY_LOW | Broadcast Receiver | 低电量的一个警告 |
ACTION_HEADSET_PLUG | Broadcast Receiver | 耳麦已经被插入设备,或者从设备上拔出。 |
ACTION_SCREEN_ON | Broadcast Receiver | 显示屏已经被打开 |
ACTION_TIMEZONE_CHANED | Broadcast Receiver | 时区相关的设置已经被改变 |
开发者也可以自己定义动作,并定义相应的Activity来处理自定义动作。我们可以通过setAction()来设置动作,通过getAction()获取动作。
一个Intent只能设置一个Action,但一个IntentFilter却可以设置多个Action过滤,意思是只要Intent满足IntentFilter中任何一个Action,这个Intent就通过了Action验证。
3、数据 Data
数据为动作提供了要操作的信息,用一个指向数据的URI(通用资源标识符)来表示。
URI的格式为“scheme://host:port/path”,如 “content://contacts/1” 表示这个URI指向通讯录第一个联系人。
Uri uri=Uri.parse("content://contacts/1");
Intent intent=new Intent(Intent.ACTION_VIEW,uri);
这里的intent对象的数据就是uri指向的数据,uri指向联系人第一个。我们在目标Activity里可以通过intent.getData()来读取uri。
在IntentFilter中,对Data的验证包括URI和MIME(数据类型),而URI又包括了scheme、authority、path,这些元素在IntentFilter中可以不设置,但如果设置了,那Intent中必须设置这些属性且一一匹配才能通过验证。
4、类别 Category
类别是关于Intent中action要执行的动作的附加描述,是一个字符串,可以把多个类别放到一个Intent对象里。
在IntentFilter中可以设置多个Category,当Intent中的某个Category与IntentFilter中的一个Category完全匹配时,此Category便通过验证,如果Intent中所有Category都通过验证后,这个Intent才能通过Category验证。
下面列出Intent类中定义的一些Category常量
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可在车载环境下使用 |
5、附加信息Extra
附加信息是要传递给目标组件的附加信息键-值对。
我们可以通过Intent.putExtra()来插入数据,如intent.putExtra('key1","value1")将字符串“value1”插进去intent对象中,对应的键为“key1”;在目标组件中我们可以通过intent.getStringExtra("key1")来获取前面存进去的字符串“value1”。这里要根据值的类型来决定要用哪个get...Extra()方法。
intent.putExtra("key1", "value1");
/* ... */
String value=intent.getStringExtra("key1");//在目标组件中读取附加信息
6、标志
标志用来指示Android系统如何去加载一个Activity和启动后如何对待它,具体的Flag常量代表什么意思可以去查相关资料,这里不做研究。