本帖最后由 武汉分校-小舞 于 2016-3-16 11:07 编辑
【武汉校区】讲师技术分享:Android中的Intent详解
在我们的Android应用当中,主要是由四种组件组成的,这四种组件想必大家都知道,activity活动,service服务,broadcastReceiver广播接收者以及contentProvider内容提供者,而这四种组件是独立的,它们之间可以互相调用,协调工作,最终组成一个真正的Android应用。 在这些组件之间的通讯中,主要是由Intent协助完成的。所以准确来说Intent是什么? 那么Intent是Android中简单的消息传递框架。使用Intent,你可以在整个系统内广播消息或者给特定的Activity或者服务来执行你的行为意图。 Intent负责对应用中一次操作的动作、涉及的数据、附加数据描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。因此,Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。 在Android参考文档中,对Intent的定义是执行某操作的一个抽象描述(确实很抽象)。我们先来看看这里的抽象描述,到底描述了什么。
首先,是要执行的动作(action)的一个简要描述,比如VIEW_ACTION(查看)、EDIT_ACTION(修改)等,Android系统默认已经为我们定义好了一套标准动作: MAIN_ACTION-作为主入口点启动,不需要数据 VIEW_ACTION-查看 EDIT_ACTION-修改 PICK_ACTION-从数据中选择一个项目(item),将被选中的项目返回 GET_CONTENT_ACTION-让用户选择数据并返回 DIAL_ACTION-拨打数据中指定的电话号码 CALL_ACTION-拨打电话,被呼叫的联系人在数据中指定 SENDTO_ACTION-向 data 指定的接收者发送一个消息 ANSWER_ACTION-处理拨入的电话 INSERT_ACTION-在容器中插入一个空项(item) DELETE_ACTION-从容器中删除给定的数据 RUN_ACTION-运行数据(指定的应用) LOGIN_ACTION-获取登录凭证 CLEAR_CREDENTIALS_ACTION-清除登陆凭证(credential) SYNC_ACTION-执行数据同步 PICK_ACTIVITY_ACTION-选择一个activity,返回被选择的 activity 的类(名) WEB_SEARCH_ACTION-执行 web 搜索 这些标准动作中,有我们使用过、见到过或者是从来未使用过的,从上述的描述中,我们只是知道了每个动作的含义,如果想弄的更加明白一点,那么就必须具体去使用一下了,学完下面的知识,你就可以试着把每一个去尝试一下了。 此外,我们还可以根据应用的需要,定义我们自己的动作,并可定义相应的Activity来处理我们的自定义动作。 其次,是执行动作要操作的数据(data),Android中采用指向数据的一个URI来表示,如在联系人应用中,一个指向某联系人的URI可能为:content://contacts/1。 这种URI表示,通过 ContentURI这个类来描述,具体可以参考android.net.ContentURI类的文档。 以联系人应用为例,以下是一些action / data对,及其它们要表达的意图: VIEW_ACTION content://contacts/1-- 显示标识符为"1"的联系人的详细信息 EDIT_ACTION content://contacts/1-- 编辑标识符为"1"的联系人的详细信息 VIEW_ACTION content://contacts/-- 显示所有联系人的列表 PICK_ACTION content://contacts/-- 显示所有联系人的列表,并且允许用户在列表中选择一个联系人,然后把这个联系人返回给父activity Intent框架中的action负责表明动作,data负责表明动作设计的数据,还有一个部分就是对于数据的附加描述了。 category(类别),被执行动作的附加信息。例如 LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现。 type(数据类型),显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。 component(组件),指定Intent的的目标组件的类名称。通常 Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。 extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。 综合来说:action、 data/type、category和extras一起组成了Intent。 说完了什么是Intent?intent的组成部分,接下来,我们说一说Android是如何解析Intent的。 在应用中,我们可以以两种形式来使用Intent: 显示Intent: 指定了component属性的Intent, 通过指定具体的组件类,通知应用启动对应的组件. 隐式Intent:没有指定comonent属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。 对于直接Intent,Android不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些间接Intent,通过解析,将 Intent映射给可以处理此Intent的Activity、IntentReceiver或Service。 Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找 到匹配的Intent。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的: 如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配; 如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。 如果Intent中的数据不是content: 类型的URI,而且Intent也没有明确指定它的type,将根据Intent中数据的scheme(比如 http: 或者mailto: ) 进行匹配。同上,Intent 的scheme必须出现在目标组件的scheme列表中。
如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。
|