Android组件通信--Intent

    刚接触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_DEFAULTandroid.intent.category.DEFAULT默认的Category
CATEGORY_BROWSABLEandroid.intent.category.BROWSABLE指定该Activity能被浏览器安全调用
CATEGORY_TABandroid.intent.category.TAB指定Activity作为TabActivity的Tab页
CATEGORY_LAUNCHERandroid.intent.category.LAUNCHERActivity显示顶级程序列表中
CATEGORY_INFOandroid.intent.category.INFO用于提供包信息
CATEGORY_HOMEandroid.intent.category.HOME设置该Activity随系统启动而运行
CATEGORY_PREFERENCEandroid.intent.category.PREFERENCE该Activity是参数面板
CATEGORY_TESTandroid.intent.category.TEST该Activity是一个测试
CATEGORY_CAR_DOCKandroid.intent.category.CAR_DOCK指定手机被插入汽车底座(硬件)时运行该Activity
CATEGORY_DESK_DOCKandroid.intent.category.DESK_DOCK指定手机被插入桌面底座(硬件)时运行该Activity
CATEGORY_CAR_MODEandroid.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常量代表什么意思可以去查相关资料,这里不做研究。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值