Android基础——Intent 和 intent-filter

来源:互联网 发布:战地4网络不好会掉帧吗 编辑:程序博客网 时间:2024/05/27 14:15

使用Intent启动系统组件:
Intent在Android应用中经常用到,我们用Intent可以启动Activity、Service、BroadCastReceiver。Intent中封装的就是我们程序想要启动程序的意图。


之前已经介绍过了Intent启动Activity。在后面的文章中将陆续讲到如何用Intent启动Service、BroadCastReceiver。


Intent大致包括:Component、Action、Category、Data、Type、Extra、Flag 7中属性。(在Activity的使用中已经认识了一些Action、Extra的用法)

Intent想要启动哪个组件,就取决于Intent中这些属性的值。



·Component:

用于明确指定需要启动的目标组件。

Component属性需要接受一个ComponentName对象,而ComponentName对象的构造器需要指定包名和类名,这样可以唯一的确定一个组件,应用程序就可以根据指定的组件启动特定的组件。
ComponentName(String pkg, String cls),
ComponentName(Context pkg, String cls),
ComponentName(Context pkg, Class<?> cls),
另外,也可以通过Intent的
setClass(Context packageContext,Class<?> cls),
setClass(Context packageContext,String className),
setClass(String packageName,String className),来确定要启动那个组件。(通过这些方法可以看出,Android应用的包名和Context对象由一一对应的关系)

之前启动Activity例子可以写成:

ComponentName comp = new ComponentName(ActivityA.this, ActivityB.class);Intent intent = new Intent();intent.setComponent(comp);startActivity(intent);

但这些方法在之前的例子中没有用到他们是因为,Intent的构造器已经为我们简化了这些过程。

当我们使用Component指定要启动的组件时,基本上不需要配置activity的<intent-filter>。这就是显式Intent。


·Action、Category:

Action代表Intent想要完成的一个抽象的动作,而具体启动哪个组件去完成这个动作,Action本身并不管。Category用于为Action增加额外的附加类别信息。Action属性和Category通常会结合使用。

例如:我们为Intent指定Intent.ACTION_VIEW,它只是抽象的表示一个查看操作,但具体查看什么,启动哪个组件来执行这个操作,并不知道———这取决于组件的<intent-filter>的设置,如果<intent-filter>设置了action属性为ACTION_VIEW就有可能被启动。像我们在之前Activity的第二个例子中那样为Intent指定了一个Action属性(其实就是一个字符串,并且虽然没有指定Category属性,但是系统会默认为我们加上一个android.intent.category.DEFAULT的category的属性),就是一个隐式的Intent。那么我们如何才能找到要启动的那个组件呢?
我们能够为每个组件(Activity、Service、BroadCastReceiver)配置<intent-filter>,在intent-filter中我们可以配置:
0~N个<action ...>子元素;
0~N个<category...>子元素;
0~1个<data...>子元素;
只要某个组件自己声明能满足的要求大于、等于Intent所指定的要求,那么该Intent就可以启动它。(需要注意的是:Intent只能包括一个Action属性)
在AndroidDeveloper文档中可以看到很多启动系统应用的Action、Category的属性。


·Data、Type:

Data通常向Action提供操作的数据(Data接受一个Uri对象:Uri字符串需要满足:Scheme://host:port/path),如:content://com.android.contacts/contacts/1就表示Android通讯录中标示为1的联系人。

Type用于指定Data所指向的Uri对应的MIME类型(MIME类型可以是任何自定义的MIME类型,只要符合abc/xyz的格式就可以了)。
Data和Type属性之间会相互覆盖:
如果为Intent先设置了Data属性,后设置Type属性,那么Type属性会覆盖Data属性;
如果为Intent先设置了Type属性,后设置Data属性,那么Data属性会覆盖Type属性;
如果希望Intent既有Data属性,又有Type属性,就要调用Intent的setDateAndType()方法;

在Manifest.xml文件中定义组件的Data、Type属性是用<data.../>标签:

<dataandroid:scheme=""android:host=""android:port=""android:path=""android:pathPrefix="" //用于声明该组件所能匹配的Intent的Data属性的path前缀android:pathPattern="" //用于声明该组件所能匹配的Intent的Data属性的path字符的模板/>


·Extra:

该属性通常用于多个Action间进行数据交换,它的属性值是一个Bundle对象。



·Flag:

为该Intent添加一些额外的控制标志。


原创粉丝点击