文章目录
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系统的其他应用的程序组件,包括系统自带的程序组件。
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属性必须与此相同,才能启动该组件。