Intent的简单介绍

来源:互联网 发布:js调用另一个js的函数 编辑:程序博客网 时间:2024/06/06 11:38

        Android程序中有三大基本组件:Activity,Service和BroadcastReceiver,而这三个组件都是通过Intent对象来激活的。Intent对象是Android程序中各个组件之间的传输数据的对象。我们可以把需要激活的组件的描述记录在Intent对象中,并利用特定的函数来实现激活指定或指定功能的组件(此时Android会根据此Intent对象的描述找到相应的组件)。

 

        Intent传输函数:

        Activity:可以将Intent对象(数组)传递给Context.startActivity()方法(Context.startActivities()方法)或者Activity.startActivityForRestult()方法,启动一个或多个Activity或者让一个已经存在的Activity去做新的事情。

        Service:可以将Intent对象传递给Context.startService()方法用于初始化一个Service或者传递一个新的指令给正在运行的Service;通过将Intent传递给Context.bindService()方法,可以建立条用组件和目标服务之间的链接。

        BroadcastReceiver:可以将Intent对象传递给广播方法(Context.sendBroadcast()、Context.sendOrderedBroadcast()和Context.sendStickyBroadcast()方法等),从而激活相应的广播接收者。

 

        Intent对象的组成:

        1.      组件名称

        组件名称用于指定处理Intent对象的组件,是一个ComponentName对象。组件名称不一定要设置,当设置的时候会直接将Intent对象直接传递到指定类的实例,如果没有设置,则通过Intent中的其他信息来寻找符合要求的组件。可以通过setComponent()方法、setClass()、setClassName()方法来设置组件名称,通过getComponent()方法来获取Intent相关的组件。

        2.      动作

        动作是决定Intent数据(data)和附加信息(extras)的重要参数,假设拨打指定电话号码,我们可以设置其动作为ACTION_CALL(拨打电话动作),并设置数据信息指定其电话号码,而电话号码这个数据不能作为其他动作诸如发送短信之类的数据信息。设置一个Intent的动作可以通过setAction()方法,而读取则可以通过getAction()方法。

        3.      数据

        数据(data)是Intent对象上的数据的URI和数据的MIME类型,不同的动作必须设置不同类型的数据规格。 如上面所说ACTION_CALL动作的Intent对象的数据应该是电话号码(实际上是tel:URI加上电话号码)。设定数据,通过setData()方法指定数据的URI,使用setType()方法可以指定数据的MIME类型,使用setDataAndType()可以指定数据的URI和MIME类型;获取数据,通过getData()方法获取数据的URI类型,通过getType()方法获取数据的MIME类型。

        4.      种类

        种类信息用于作为被执行动作的附加信息,在一个Intent对象中,可以指定任意数量的种类信息描述。。通过addCategory()方法可以添加一个种类到Intent对象中,使用removeCategory()方法可以移除一个已经添加的种类,使用getCategory()方法可以获取Intent对象中的所有种类。

        5.      附加信息

        在很多时候我们都需要从一个组件传递一些额外的值到另一个组件。Intent对象可以添加附加信息,以便组件之间的数据传输。在Intent对象有一系列的putXXX()方法和getXXX()方法分别用于插入附加信息和获取附加信息。另外,附加信息可以作为一个Bundle对象使用putExtras()和getExtras()方法插入和读取。

        6.      标志

        标志主要是用于指示程序如何去运行一个Activity,以及启动之后如何对待它。可以用setFlags()和addFlags()方法添加标志到一个Intent对象中去;getFlags()海阔去Intent对象中所有标志。

 

 

        Intent对象解析

        Intent对象可以分为显式Intent和隐式Intent。

        显式Intent:通过名字直接指定目标组件。由于很难清楚其他相关组件的具体名字,所显示Intent一般用于应用程序内部组件的调用和消息传递。

        隐式Intent:不直接指定组件名称,通过Intent的信息将信息传递到指定的组件,常用于激活其他应用程序的组件。

        Intent过滤器

        一个组件为了让系统明白其能处理怎样的事务,可以拥有一个或者多个Intent过滤器。过滤器的作用在于过滤掉不符合条件的Intent对象,只留下能通过过滤器、所要求的事务能被该组件接受、处理的Intent对象。Intent过滤器的设置在AndroidMainfest.xml文件中设置。Intent对象要传递到指定组件,必须至少通过一个指定组件的一个过滤器

        Intent过滤器需要检测的有三个字段:动作、数据、种类。

        1.      动作检测

        在AndroidMainifest.xml文件中,在<activity>元素中的<intent-filter>元素中可以添加,添加的元素标签为<action>,并列出指定的动作信息。如:

<action android:name="android.intent.action.MAIN" />

        如果Intent对象没有指定动作,则自动通过检查<intent-filter>过滤器是否指定了动作;如果<intent-filter>过滤器没有指动作,则没有一个Intent通过,全部会匹配失败。

        2.      数据检测

        在AndroidMainifest.xml文件中,<activity>元素中的<intent-filter>元素中可以添加标签为<data>列数所有的数据信息。如:

<data android:mimeType="audio/mpeg" android:scheme="http:"/>

        该元素需要指定一个数据类型(MIME类型)和一个URI。<data>子元素有4个属性,分别为scheme、host、port和path,分别对应URI的各个部分。例如:

content://com.amia.test:80/pic/human/face

        scheme对应content,host对应com.amia.test,port对应80,path对应pic/human/face。四个属性可选,但不完全独立。Intent对象和Intent-filter过滤器都可以用“*”来表示任何子类型。

        数据检测的规则如下:

        如果Intent对象既不包含URI,也不包含数据类型(MIME类型),仅当Intent-filter过滤器不指定URI和数据类型的时候才不能通过,否则全部通过。

        如果Intent对象包含URI但不包含数据类型,仅当Intent-filter过滤器指定URI并与该对象匹配,并且不指定数据类型才能通过。

        如果Intent对象不包含URI,但包含数据类型,仅当Intent-filter过滤器指定的数据类型和该对象的数据类型匹配,并且过滤器不指定URI才能通过。

        如果对象包括URI和数据类型,数据类型部分,只有与intent-filter过滤器中的一个匹配才算通过;URI部分,它的URI要出现在intent-filter过滤器中,或者它有content:或file:URI,又或者intent-filter过滤器没有指定URI。

        3.      种类检测

        种类检测可以在intent-filter过滤器中用<category>标签列出,如:

<category android:name="android.intent.category.LAUNCHER" />

        一个Intent对象要通过种类过滤器,必须其包含的种类全部在intent-filter过滤器中能够找到,只要有一个找不到,便匹配失败,无法通过。因此,原则上一个Intent对象如果不包含任何种类信息,则一般会通过检测,但又一种情况例外,Android程序对待所有传递给Context.startActivity()的隐式Intent,至少包含有android.intent.category.DEFAULT,因此,Activity要接收隐式Intent,就必须在intent-filter过滤器中包含android.intent.category.DEFAULT。

        通用情况

            组件能够从内容提供者或文本获取数据本地数据,因此,可以直接在过滤器中直接列出数据类型而不需要指明content:和file:scheme的名字。如:

<data android:mineType=”image/*” />

        这行代码主要告诉程序,这个组件能够接受image数据并处理它。由于大部分可用数据由内容提供者分发,所以过滤器指定一个数据类型,但不指定URI或许最通用。

        在过滤器中用data指定一个scheme类型和一个数据类型,代码如下:

<data android:scheme=”http” android:type=”video/*” />

        表明该组件能从网络获取视频资源并处理它。

        利用Intent匹配

        Intent对照intent-filter过滤器,不仅可以用于发现组件、传递信息和激活组件,还可以发现一些组件的其他信息。如,Android程序填充应用程序启动列表,最高层显示用户能够启动的应用程序,可以利用Intent对象检测过滤器中是否包含android.intent.action.MAIN动作和android.intent.category.LAUNCHER种类过滤器,然后启动列表中显示这些应用的图标和标签。



0 0
原创粉丝点击