Intent的7种属性

来源:互联网 发布:西数移动硬盘在无网络 编辑:程序博客网 时间:2024/05/22 03:02

强调!!!以下只是我个人看法,如有错误的地方请文明指出微笑,如有其他看法请耐心讨论微笑,如有看不懂可以参考其他有关博客微笑,最后如有想喷的出门左转不谢。微笑

intent对象大致包含Component(ComponentName)、Action、Category、Data、Type、Extra和Flag这7种属性。intent是“意图”的意思,可以启动指定的组件,至于启动那个组件是根据intent的各种属性决定的。

可以分为三类:

第一类:启动,有ComponentName(显式),Action(隐式),Category(隐式)。

第二类:传值,有Data(隐式),Type(隐式),Extra(隐式、显式)。

第三类:启动模式,有Flag。


一、Component属性:可以显示的启动指定组件,可以再同个app下,也可在不同app下

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类所对应的组件。

除此之外,intent还包含如下三种方法:

setClass(Context packageContext,Class<?> cls):设置该intent将要启动的组件对应的类。

setClassName(Context packageContext,String className):设置该intent将要启动的组件对应的类名。

setClassName(String packageContext,String className):设置该intent将要启动的组件对应的类名。

例通过显示intent启动另一个Activity(1,2,3等同):

1、

//创建一个ComponentName对象

ComponentName comp = new ComponentName(MainActivity.this,OtherActivity.class);

Intent intent = new Intent();

//为Intent设置一个Component属性

intent.setComponent(comp);

startActivity(intent);

2、

Intent intent = new Intent(MainActivity.this,OtherActivity.class);

startActivity(intent);

3、

Intent intent = new Intent();

intent.setClass(this,OtherActivity.class);

startActivity(intent);

OtherActivity中获取该activity对应的Intent的Component属性:ComponentName comp = getIntent().getComponent();

获取该ComponentName对象的包名、类名:comp.getPackageName();comp.getClassName();

二、Action、Category属性:

Action代表该intent所要完成得一个抽象“动作”,而Category则用于为Action增加额外的附加类别信息,通常Action与Category属性结合使用。

Action是要完成一个抽象的动作,这个动作具体由那个组件来完成,Action本身并不管。这取决于Activity的<intent-filter.../>配置,只要某个Activity的<intent-filter.../>配置中包含了Action提供的Intent.ACTION_VIEW,该activity可能被启动。Intent通过指定的Action属性(属性值其实就是一个普通的字符串),就可以把该Intent与具体的Activity分离,从而提供高层次的解耦。

例intent的Action属性;


在配置文件中需要在被启动的activity中加入<intent_filter.../>的子元素<action.../>当程序创建Intent的时候,该intent默认启动Category属性值为Intent.CATEGORY_DEFAULT(常量值为android.intent.category.DEFAULT)的组件。


Category同Action一样,但是一个Intent对象最多只用一个Action属性,程序可调用Intent的setAction(String s)的方法来设置Action的属性值,但是一个Intent对象可以包括多个Category属性,程序可以用Intent的addCategory(String s)方法来为Intent添加Category属性。

三、Data、Type属性:

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

content://com.android.contacts/contacts/1

tel:123

Uri字符串满足如下格式:

scheme://host:port/path

上面的content://com.android.contacts/contacts/1,其中content是scheme的部分,com.android.contacts是host的部分,part的部分被省略了,/contacts/1是path的部分。

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

Data属性与Type属性吧会相互覆盖,如果intent先设置Data属性后设置Type属性,那么type属性会把Data属性覆盖掉。

如果希望两个属性都用那么要使用intent.setDataAndaType()方法。

在配置文件中为组件声明Data和Type属性都通过<data.../>元素,格式如下:

<Data

      android:mimeType = ""

      android.scheme = ""

      android.host = ""

      android.port = ""

      android.path = ""

      android.pathPrefix = ""

      android.pathPattern = ""

/>

android:mimeType = "":为声明该组件所能匹配的Intent的Type属性。

android.scheme = "":用于声明该组件所能匹配的Intent的Data属性的scheme部分。

android.host = "":用于声明该组件所能匹配的intent的Data属性的host部分。

android.port = "":用于声明该组件所能匹配的intent的Data属性的port部分。

android.path = "":用于声明该组件所能匹配的intent的Data属性的path部分。

android.pathPrefix = "":用于声明该组件所能匹配的intent的Data属性的path前缀。

android.pathPattern = "":用于声明该组件所能匹配的intent的Data属性的path字符串模板。

在Intent的Data属性中并不要求<data../>子元素schemehostport.path完全满足,但是要遵循以下规则:

如果目标组件的<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.hostandroid.port属性值相同,即可启动该组件。如果<data.../>元素只有android.port属性,没有指定android.host属性,那么android.port属性将不会起作用。

如果目标组件的<data.../>子元素指定了android.scheme、android.host、android.path属性,那么只要Intent的Data属性的scheme、host、path部分与android.scheme、android.hostandroid.path属性值相同,即可启动该组件。如果<data.../>元素只有android.path属性,没有指定android.host属性,那么android.path属性将不会起作用。

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

四、Extra属性:

Intent的Extra属性通常用于在多个Action之间进行数据交换。Intent的Extra属性相当于一个Bundle对象,Bundle对象就像一个Map对象,它可以存入多个键值对,这样就可以通过Intent在不同Activity之间进行数据交换。

五、Flag属性:
Intent的Flag属性用于为该Intent添加一些额外的控制旗标,Intent可以调用addFlag()方法来添加控制旗标。

以上借鉴了《疯狂Android讲义》第三版第五章

0 0
原创粉丝点击