5 使用Intent和IntentFilter通信


Android应用程序包含三种重要组件:Activity、Service、BroadcastReceiver,它们都是靠Intent来启动的。Intent封装了程序想要启动程序的意图,还可用于和被启动组件交换信息。

Intent的属性及intent-filter配置

Component属性

Intent的Component属性需要接受一个ComponentName对象。
ComponentName的构造器:

  • ComponentName(String pkg, String cls):创建pkg所在包下的cls类所对应的组件。
  • ComponentName(Context pkg, String cls):创建pkg所在包下的cls类所对应的组件。
  • ComponentName(Context pkg,Class<?> cls):创建pkg所在包下的cls类所对应的组件。

这说明创建一个ComponentName需要指定包名和类名,这就可以唯一的确定一个组件类,这样应用程序即可根据给定的组建类去启动特定的组件。

此外,Intent还提供了三个指定包名和类名的方法:

  • seClass(Context packageContext, Class<?> cls):设置该Intent将要启动的组件对应的类。
  • setClassName(Context PackageContext, String className):设置该Intent将要启动的组件对应的类名。
  • setClassName(String PackageContext, String className):设置该Intent将要启动的组件对应的类名。

Android应用的Context代表了访问该应用环境的接口,而Android应用的包名则作为应用的唯一标识,因此Android应用的Context对象与该应用的包名有一一对应的关系。

指定Component属性的Intent已经明确了它将要启动哪个组件,因此这种Intent被称为显示Intent;没有指定Component属性的Intent,没有明确指定要启动哪个组件,应用将会根据Intent指定的规则去启动符合条件的组件,但具体是哪个组件则不确定,称为隐式Intent

Action、Category属性与intent-filter配置

Intent的Action、Category属性的值都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象的“动作”,而Category则用于为Action增加额外的附加类信息。通常Action属性会与Category结合使用。

一个Intent对象可以包含一个Action属性和多个Category属性,只有全部符合Action属性和Category属性的组件才会被启动。

Intent的Action属性通过setAction(String str)方法指定,Category属性则通过addCategory(String str)方法指定。当创建Intent时,该Intent默认启动Category属性为Intent.CATEGORY_DEFAULT常量(常量值为android.intent.category.DEFAULT)的组件。

待启动组件的Action属性和Category属性则通过在AndroidManifest.xml中的<intent-filter>子元素下添加<action><category子元素实现。<action>、<category>子元素的配置非常简单,它们都可指定android:name属性,该属性的值就是一个普通的字符串。

指定Action、Category调用系统Activity

Intent对象不仅可以启动本应用内程序组件,也可以启动Android系统的其他应用的程序组件,包括系统自带的程序组件。

实例:返回系统Home桌面

Data、Type属性与intent-filter配置

Data:属性
Action属性通常用于向Action属性提供操作的数据。Data属性接受一个Uri对象,该Uri对象通常通过如下如下形式的字符串来表示:

scheme://host:port/path

程序员为Intent指定Data属性时,并不要求被启动组件的<intent-filter>中<data>子元素的android:scheme、android:host、android:port、android:path完全满足。

Data属性的匹配过程:它会先检查<intent-filter>里的<data>子元素,然后:

  • 如果目标组件的<data>子元素只指定了android:scheme属性,那么只要Intent的Data属性的scheme部分与android:scheme属性值相同,即可启动该组件。
  • 如果目标组件的<data>子元素只指定了android:scheme、android:host属性,那么只要Intent的Data属性的scheme、host部分与android:scheme、android:host属性值相同,即可启动该组件。
  • 如果目标组件的<data>子元素只指定了android:scheme、android:host、android:port属性,那么只要Intent的Data属性的scheme、host、port部分与android:scheme、android:host、android:port属性值相同,即可启动该组件。
  • 如果目标组件的<data>子元素只指定了android:scheme、android:host、android:path属性,那么只要Intent的Data属性的scheme、host、path部分与android:scheme、android:host、android:path属性值相同,即可启动该组件。
  • 如果目标组件的<data>子元素指定了android:scheme、android:host、android:port、android:path属性,那么就要求Intent的Data属性的scheme、host、port、path部分与android:scheme、android:host、android:port、android:path属性值相同,即可启动该组件。

Type属性:
Type属性用于指定该Data属性所制定的Uri的MIME类型,这种MIME类型可以是任何自定义的MIME类型,只要符合abc/xyz格式的字符串即可。

Data属性与Type属性的关系比较微妙,先设置的Data属性或Type属性会被后设置的Data属性或Type属性覆盖。只有调用Intent的setDataAndType()方法才能既有Data属性又有Type属性。

在AndroidManifest.xml文件中为组件声明Data、Type属性都是通过<data…/>元素,格式如下:

<data: android:mimeType=""
	android:scheme=""
	android:host=""
	android:port=""
	android:path=""
	android:pathPrefix=""
	android:pathPattern="" />
  • mimeType:用于声明该组件所能匹配的Intent的Type属性。
  • scheme:用于声明该组件所能匹配的Intent的Data属性的scheme部分。
  • host:用于声明该组件所能匹配的Intent的Data属性host部分。
  • port:用于声明该组件所能匹配的Intent的Data属性port部分。
  • path:用于声明该组件所能匹配的Intent的Data属性path部分。
  • pathPrefix:用于声明该组件所能匹配的Intent的Data属性path前缀。
  • pathPattern:用于声明该组件所能匹配的Intent的Data属性path字符串模板。

Intent的Type属性也用于指定该Intent的要求,对应组件中<intent-filter>元素的<data>子元素的mimeType属性必须与此相同,才能启动该组件。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值