`
4ever000_1988
  • 浏览: 24979 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Intent 的工作机制

阅读更多

     Android 中各个组件主要是通过Intent来通讯。

    Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。 

    Intent在这里起着一个媒体中介的作用,专门提供组件互相调用的相关信息,实现调用者与被调用者之间的解耦。 sdk文档对其描述如下: 

    An intent is an abstract description of an operation to be performed. It can be used with startActivity to launch an Activity, broadcastIntent to send it to any interested BroadcastReceiver components, and startService(Intent) or bindService(Intent, ServiceConnection, int) to communicate with a background Service.
An Intent provides a facility for performing late runtime binding between the code in different applications. Its most significant use is in the launching of activities, where it can be thought of as the glue between activities. It is basically a passive data structure holding an abstract description of an action to be performed. The primary pieces of information in an intent are: 
    1. startActivity 
    2. broadcastIntent 
    3. startService() 

    4. bindService() 
    Intent的各个属性:

    1. action ,是要执行的动作(action)的一个简要描述,如VIEW_ACTION(查看)、EDIT_ACTION(修改)等,Android为我们定义了一套标准动作。

    2. data,是执行动作要操作的数据(data),Android中采用指向数据的一个URI来表示。

    3. category,被执行动作的附加信息。例如 LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent被加进ALTERNATIVE intent列表里面,用户可以启动。

    4. type(数据类型),显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。

    5. component(组件),指定Intent的的目标组件的类名称。通常 Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所有属性都是可选的。

    6. extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。

    在应用中,我们可以以两种形式来使用Intent:  

    1:显式Intent:指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context, Class)来指定)。通过指定具体的组件类,通知应用启动对应的组件。

    2:隐式Intent:没有指定comonent属性的Intent。这些Intent需要包含足够的信息,这样系统才能根据这些信息,在在所有的可用组件中,确定满足此Intent的组件。 

    应用程序的组件为了告诉Android系统自己能响应、处理哪些隐式Intent请求,可以声明一个甚至多个IntentFilter。每个IntentFilter描述该组件所能响应Intent请求的能力——组件希望接收什么类型的请求行为,什么类型的请求数据。比如:网页浏览器程序的IntentFilter就应该声明它所希望接收的Intent Action是WEB_SEARCH_ACTION,以及与之相关的请求数据是网页地址URI格式。 

    隐式Intent和IntentFilter进行比较时的三要素是Intent的Action、Data以及Category。实际 上,一个隐式Intent请求要能够传递给目标组件,必要通过这三个方面的检查。如果任何一方面不匹配,Android都不会将该隐式Intent传递给 目标组件。 

    对于直接Intent,Android不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些间接Intent,通过解析,将 Intent映射给可以处理此Intent的Activity、IntentReceiver或Service。 

    Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的,判断方法如下: 

    1.如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配。 
    2.如果Intent没有提供type,系统将从data中得到数据类型。和action一样,如果Intent指明定了type,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。 
    3.如果Intent中的数据不是content: 类型的URI,而且Intent也没有明确指定它的type,将根据Intent中数据的scheme (比如 http: 或者mailto: ) 进行匹配。同上,Intent 的scheme必须出现在目标组件的scheme列表中。 
    4.如果Intent指定了一个或多个category,这些类别必须全部出现在组件的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。Activities will very often need to support the CATEGORY_DEFAULT so that they can be found by Context.startActivity(). 
    5.如果category 指定了ALTERNATIVE and SELECTED_ALTERNATIVE.则可以通过queryIntentActivityOptions(ComponentName, Intent[], Intent, int),查询Activity的action,addIntentOptions(int, int, int, ComponentName, Intent[], Intent, int, MenuItem[])增加action等信息。

 

分享到:
评论

相关推荐

    Android的Intent实验

    通过这个实验,开发者可以深入理解Intent的工作原理,并学会如何在实际项目中有效利用Intent进行组件间的通信。通过不断的实践,你会更加熟练地运用Intent,提升Android应用的交互性和用户体验。

    Android+Intent机制实例详解.rar

    总结,Intent机制是Android框架的核心部分,理解和熟练运用Intent对于开发高效、灵活的应用至关重要。无论是启动Activity、Service,还是进行组件间的通信,Intent都是不可或缺的桥梁。通过实例学习和实践,开发者...

    Intent系统调用示例

    在Android开发中,Intent是一种非常重要的组件间通信机制。它被用来启动活动(Activity)、服务(Service)或者广播接收器(Broadcast Receiver),并且可以传递数据和执行动作。本篇文章将详细解析“Intent系统调用...

    Intent 与 Intent Filters 实现外部调用

    下面将详细讲解Intent和Intent Filters的工作原理以及如何使用它们来实现外部调用。 Intent是Android系统中的一个消息传递对象,用于在组件之间传递请求或数据。它分为显式Intent和隐式Intent两种类型。显式Intent...

    Android Intent机制实例详解

    **Android Intent机制详解** Intent是Android系统中一个至关重要的组件,它是应用程序间以及应用程序内部组件(如Activity和服务Service)通信的主要桥梁。Intent不仅用于不同应用之间的交互,还用于在同一应用内的...

    android整合--intent

    在Android开发中,Intent是一种非常重要的组件间通信(IPC)机制。Intent主要用于启动或与其它应用程序组件进行交互,如活动(Activity)、服务(Service)、广播接收器(BroadcastReceiver)以及内容提供者...

    Android应用:Intent打开另外一个Activity,Intent拨电话,Intent在2个Activity间传递参数

    在Android应用开发中,Intent是一种强大的机制,用于在组件之间进行通信。Intent不仅可以用来启动新的Activity,还可以启动服务、广播接收器等。本教程将详细讲解如何使用Intent来实现特定的功能,包括打开新的...

    Android利用Intent启动和关闭Activity

    但在大多数情况下,系统的Activity管理机制足以处理Activity的生命周期,无需手动调用`finish()`。 ```java // 关闭当前Activity finish(); ``` 此外,如果需要关闭之前启动的独立Activity,可以使用`finish...

    Intent学习

    【Intent学习】 ...理解并熟练运用Intent及其相关机制,对于提升应用的用户体验和功能实现具有决定性作用。通过深入学习Intent,开发者可以更好地驾驭Android平台,构建出功能强大、易于扩展的应用程序。

    java Intent的应用小例子

    在Android开发中,Intent是一种非常重要的组件,它用于在应用程序的不同组件之间传递消息,实现活动(Activity)之间的交互。Intent不仅用于启动新的...在实践中不断尝试和练习,将有助于深化对Intent机制的理解。

    Intent使用示例(一)

    本文将深入探讨Intent的使用示例,包括`startActivityForResult`的运用,以及Bundle与Intent保存对象的机制。 首先,Intent分为显式Intent和隐式Intent两种类型。显式Intent通过指定目标组件的全类名来启动特定的...

    android用于打开各种文件的intent.pdf

    Android 操作系统提供了 Intent 机制,允许应用程序之间进行交互和通信。Intent 是一个异步的消息机制,用于在应用程序之间请求或提供服务。通过使用 Intent,可以实现打开各种文件类型,例如 PDF、PPT、WORD、EXCEL...

    隐式Intent

    隐式Intent是Android系统中的一种重要机制,它用于在应用程序之间建立通信桥梁,使得不同的应用组件可以互相调用,实现跨组件交互。隐式Intent不指定具体的接收者,而是通过定义一个行动(Action)、数据(Data)、...

    android----intent

    在Android操作系统中,Intent是一种强大的组件间通信机制,它用于启动其他应用程序组件,如Activity、Service,甚至BroadcastReceiver。Intent不仅能够传递数据,还能在应用的不同部分之间建立连接,是Android开发中...

    android Intent的用法

    在Android开发中,Intent是一种非常重要的组件间通信机制。它被用来启动活动(Activity)、服务(Service)或者广播接收器(Broadcast Receiver),并且可以传递数据和执行动作。本篇文章将详细解析Intent的用法。 ...

    实验10 使用Intent进行通信

    在Android应用开发中,Intent是一种强大的机制,用于在不同的组件之间进行通信,特别是在Activity之间。实验10的主题是“使用Intent进行通信”,这涉及到Android应用的基本架构和交互流程。在这个实验中,开发者创建...

Global site tag (gtag.js) - Google Analytics