Android应用程序组件间通信(一)——Intent类简介

    Intent类的对象是组件间通信的载体,组件间通信就是一个一个的Intent对象在不断传递。Android的三大核心组件Activity,Service和BroadcastReceiver通过Intent对象进行通信。对于这三个组件,Intent的作用方式为:

    Activity组件:Intent主要通过调用Context.startActivity(),Context.startActivityForResult()等方法实现传递,其结果就是启动一个新的Activity或者使当前Activity开始新的任务。

    Service组件:Intent主要通过调用Context.startService()和Context.bindService()方法实现传递。起作用结果是初始化并启动一个服务或绑定一个服务到Context对象。

    BroadcastReceiver组件:Intent主要通过sendBroadcast()等一系列发送广播的的方法实现传递。起作用结果就是将Intent组件以广播的形式发出,以便合适的组件接收。

一个Intent对象就是一组信息,其包含一下内容:

    一:Component Name 部分

        这部分(组件名)指定了未来要处理该Intent对象的组件,封装在一个ComponentName对象中,该对象唯一标识一个应用程序组件。ComponentName类包含两个String成员,分别代表组件的全称类名和包名,包名必须和AndroidManifest.xml文件中标记中的对应信息一致。

        组件名通过setComponent(),setClass()或setClassName()设置,通过getComponent()读取。

        对于Intent,组件名并不是必须的。如果一个Intent对象添加了组件名,则称该Intent为“显示Intent”,这样的Intent在传递的时候会直接根据组件名去寻找目标组件。如果没有添加组件名,则称为“隐式Intent”,Android会根据Intent中的其他信息来确定响应该Intent的组件。

    二:Action 部分

        Action部分是一个字符串对象。描述了Intent会触发的动作。Android系统中已经预定义了一些Action常量,可以参看sdk帮助文档,如ACTION_MAIN,ACTION_CALL等。同时,开发者也可以定义自己的Action描述。一般来讲,定义自己的Action字符串应该以应用程序的包名为前缀(防止重复定义)。由于Action部分很大程度上决定了一个Intent的内容,所以自己定义的Action字符串应该能够一眼看出其意图。

        一个intent对象的动作通过setAction()方法设置,通过getAction()方法读取。

    三:Data 部分

        Data部分描述了Intent的动作所能操作的数据的MIME类型和URL,不同的Action对用不同的操作数据。如:当Action字段是ACTION_EDIT时,Data字段将包含将用于编辑的文档的URL。当为组件进行Intent匹配检查时,正确设置Data的URL资源和数据类型很重要。许多情况下,数据类型能够从URL中推测,特别是content:URL,它表示位于设备上的数据切由内容提供者(Content Provider)提供。

        setData()方法指定数据的URI,setType()指定MIME类型,setDataAndType()指定数据的URI和MIME类型。通过getData()读取URI,getType()读取类型。

    四:Category 部分

        Category为字符串对象,包含了可以处理Intent的组件的类别信息,Intent中可以包含任意个Category。Android同样预定义了一些Category常量,但是和Action不同的是,开发者不能自定义Category。

        调用addCategory()方法添加一个种类到Intent对象中,removeCategory()方法可以删除一个之前添加的种类,getCategories()方法获取Intent对象中的所有种类。

    五:Extras 部分

        Extras部分是一组键值对,包含了需要传递给目标组件并有其处理的一些额外信息。

        Intent有一些列putXXX()方法用于插入各种附加数据,有一些列getXXX()方法可以取出一些列数据。

    六:Flags 部分

        一些有关系统如何启动组件的标志位(如,Activity应该属于哪个任务),和启动后该如何对待它(如,是否属于最近的活动列表),所有标志位都已经在Android系统中预定义了。

你可能感兴趣的:(Android学习)