`
sbl2255
  • 浏览: 218551 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Intent总结

 
阅读更多

Activity、Service和Broadcast Receiver这些核心组件之间通过消息激活,这个消息就是Intent。

Intent消息可用于当前运行时同应用内部的组件之间或者不同应用的组件之间通信。Intent自身,即一个Intent对象,包含说明一个执行操作的抽象数据结构,传递给执行操作的组件,或者,常见于broadcast的情况,该数据结构用于描述正在执行或者已经发生的事情。

针对组件类型不同,发送Intent有不同的机制:

  • 针对Activity,Context.startActivity()方法传递Intent,启动一个新的Activity,或者Activity.startActivityForResult()方法启动新的Activity做完事情后返回到本Activity来;
  • 针对Service,Context.startService()方法,用于创建一个Service或者传递给已经运行Service一个指令,于此类似,Context.bindService()建立当前组件和Service之间的连接,可选的,如果该Service未运行,可以创建新的实例;
  • 针对Broadcast Receiver,可通过:Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()方法发送Intent给所有感兴趣的broadcast receiver。

在以上各种情况下,Android系统找到适合响应该Intent的activity、service或者broadcast service集合。不会出现重叠现象,即,broadcast intent只会发送给broadcast receiver,而不会发送给Activity或者Service。

Intent对象

Intent对象可绑定一组信息:

  • 接收intent的组件需要的信息,比如需要调用系统照相机Activity,要告知它照片存放的路径;
  • Android系统需要的信息,比如那个种类的组件可以处理这个Intent,在比如,告知如何启动Activity(比如要求它在哪个task中)。

Intent对象主要包含以下内容:

  • componnet name,组件名称,可处理这个Intent的组件名称。组件名称是可选的,如果填写,Intent对象会发送给指定组件名称的组件,否则,也可以通过其他Intent信息定位到适合的组件。组件名称是个ComponentName类型的对象,该对象又包括:
    • 目标组件完整的类名,比如:com.example.project.app.FreneticActivity;
    • 在manifest文件中设置的包名,组件的包名和manifest中定义的包名可以不匹配。
  • action,命名动作的字符串,用于执行动作,或者,在广播的情况下,表示发生的或者要报告的动作。Intent类定义了一组action常量,见API的Intent.ACTION_*。这些是Intent类预制的一些通用action,还有一些action定义在android其他API中。用户可以定义自己的action字符串常量,用于激活自己的应用组件。这需要把应用的包名作为该字串的前缀,比如:com.example.project.SHOW_COLOR。action名称很像java调用的方法名,下面提到的data和extra类似参数和返回值。
  • data,起到表示数据和数据MIME类型的作用。不同的action是和不同的data类型配套的。比如,action是ACTION_EDIT,那么data要包含要编辑的文档URI。如果action是ACTION_CALL,data可能是tel:前缀后面跟电话号码,在比如action是ACTION_VIEW,data是http:开头的URI,则应该是显示或者下载该uri的内容。在匹配intent到能处理该组件的过程中,data(MIME类型)类型是很重要的。比如,一个组件是可以显示图片数据的而不能播放声音文件。很多情况下,data类型可在URI中找到,比如content:开头的URI,表明数据在设备上,而且有content provider控制。但是有些类型只能显式的设置。setData()方法只能设置data的uri,setType()可设置MIME类型,setDataAndType()即可设置URI也可设置MIME类型。
  • category,包含处理intent组件种类的额外信息。对一个Intent可以设置任意多个category描述,和cation类似,Intent类预制了一些category常量,Intent.CATEGORY_*。
  • extras,可以看作一个Map,通过键值对,可为处理Intent组件提供一些附加的信息。可通过put..()和get..()存取信息。也可以获取Bundle对象,然后通过putExtras()和getExtras()方法存取。
  • flug,用于多种情况,在intent增加flug,比如可以指示Android如何启动一个activity,比如是否属于或者不属于当前task,以及,处理完毕后activity的归属。这些flag都定义在Intent类的常量中。
Intent解析

intent的投递,有两种方式:

  • 显式的设定目标组件的component名称。不过有时开发者不知道其他应用的component名称。显式方式常用于自己应用内部的消息传递,比如应用中一个activity启动一个相关的service或者启动一个姊妹activity;
  • 隐式intent,component名称为空的情况。这种方式往往用于激活其他应用中的组件。

android投递一个显式的intent,只需找到对应名称的组件即可。

隐式的intent需要用到不同的策略。android需要找到处理这个intent的最合适组件(集合)。要通过intent filter,比较intent对象和组件关联结构。filter根据组件的能力决定他们能处理哪些intent。android系统打开合适的组件处理相应的隐式intent。如果组件不包含任何intent filter,那只能接收显式的intent。带filter的组件既可接收隐式intent也可接收显式的。

Intent有三个方面可用于intent filter:

  • action
  • data,包括URI部分和数据类型部分
  • category

extra和flag在这方面不起作用。

Intent filter

为了能支持隐式intent,activity、service和broadcast receiver会包含1到多个intent filter。每个intent filter描述组件的可接收一组intent的能力。在intent filter中,说明了可接受的类型,以及不想要的intent。隐式的intent要想投递到一个组件,只需通过组件的一个filter即可。

组件把filter分成多个,是为了针对具体不同的任务。在sample中的Note pad示例中,NoteEditor activity有两个filter,一个用于启动并打开指定的note,另一个是为了打开新的空的note。

一个intent filter是一个IntentFilter类的实例。但是,android系统必须在组件未启动的情况下就知道它的能力,因此intent filter一般不会在java代码中设置,而是在应用的manifest文件中作为<intent-filter>元素的方式声明。一个例外是,为broadcast receiver注册动态的filter,可以调用Context.registerReceiver()方法,通过直接实例化IntentFilter对象创建。

filter有三个平等的部分:action、data和category。隐式intent将测试这三个部分。一个intent要想投递到一个组件,那么这三个测试都要通过才行。当然如果组件有多个intent filter,可能一个intent没有通过,但是通过了另外的一个,这样也可以把intent投递到组件。

action测试

在intent filter中可以包含多个action,比如:

<intent-filter . . . > 
    <action android:name="com.example.project.SHOW_CURRENT" /> 
    <action android:name="com.example.project.SHOW_RECENT" /> 
    <action android:name="com.example.project.SHOW_PENDING" /> 
    . . . 
</intent-filter>

要想通过测试,intent中的action名称要匹配其中之一。

如果intent filter中不包含action列表,而intent指定action,那么intent没有匹配的action,不通过;intent未指定action,而intent filter指定,会自动通过测试。

category测试

在intent filter中可包含category列表:

<intent-filter . . . > 
    <category android:name="android.intent.category.DEFAULT" /> 
    <category android:name="android.intent.category.BROWSABLE" /> 
    . . . 
</intent-filter>

intent想通过测试,必须匹配一个intent filter中的category。

原理上讲,intent如果没有category设置,那么总是可以通过测试。这基本上是正确的,但是有一个例外。Android在为所有隐式intent执行startActivity()方法的时候,会认为它们至少包含了一个android.intent.category.DEFAULT。因此,如果activity想收到隐式intent,必须加入这个category。

date测试

data元素在intent filter元素中,可以重复多次(action和category不允许重复的),也可以根本没有。比如:

<intent-filter . . . > 
    <data android:mimeType="video/mpeg" android:scheme="http" . . . /> 
    <data android:mimeType="audio/mpeg" android:scheme="http" . . . /> 
    . . . 
</intent-filter>


在data元素中指定uri和数据类型(MIME类型)。uri是被分开表示的:

scheme://host:port/path

其中host和port是关联的,如果host没有设置,port也会忽略。

所有这些属性都是可选的,但是不是独立的。比如,如果要设置path,那么也必须设置schema、host和port。

在比较intent中的uri和intent filter中指定的uri时,只会比较intent filter中提及的URL部分。比如,intent filter中只提及了schema,那么所有url包含这个schema的都匹配。在filter的path部分可以使用通配符做到灵活的匹配。

mimeType属性,比uri方式更常用。intent和intent filter都可以使用mime通配符的方式,比如,text/*。

如果既有mimeType,又有uri的情况,比较规则如下:

  • 如果intent和intent filter都没有设置任何uri和mimetype,通过;
  • intent包含uri但是没有data type的情况,intent filter的uri部分与之匹配,而且也没有data type部分,可以通过,比如mailto:和tel:
  • intent对象包含数据类型但是没有uri部分,那么仅当intent filter也只有数据类型,而没有uri部分的时候能通过;
  • intent对象包括uri和数据类型(或者数据类型在uri中),分两部分测试,intent对象的数据类型要匹配intent filter,intent对象的uri,或者匹配intent filter中的uri,或者intent filter中没有uri部分(仅当intent对象的uri是content:或者file:的时候)


转自:http://marshal.easymorse.com/archives/2972
分享到:
评论

相关推荐

    Intent总结04 Data和Type属性

    Intent分为显式Intent和隐式Intent,而"Intent总结04 Data和Type属性"主要聚焦于Intent的数据(data)和类型(type)两个关键属性,它们在创建Intent时发挥着至关重要的作用。 1. **Intent的数据(data)**: Intent的数据...

    Intent总结03 Action属性

    在Android开发中,Intent是一种非常重要的组件间通信机制。Intent主要用于启动另一个Activity或者Service,同时还可以传递数据。本文将深入探讨Intent中的Action属性,包括如何使用自定义Action和系统内置的Action。...

    Intent总结02 component和显式意图

    在Android应用开发中,Intent是一种强大的机制,用于在应用程序组件之间进行通信。本文将深入探讨“显式意图”(Explicit Intent),这是Intent的一种类型,它明确指定了接收者组件。 **显式意图详解** 显式意图是...

    intent总结代码

    下面是对Intent的详细总结: 1. **Intent的基本类型** - 显式Intent:指定要启动的具体组件(Activity或Service),通过类名或组件的ComponentName来明确指定。 - 隐式Intent:不指定具体组件,而是定义一个行动...

    android intent 使用总结

    Android Intent 使用总结 Android Intent 是 Android 组件之间通讯的核心机制,它负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述。Android 则根据 Intent 的描述,找到对应的组件,将 Intent 传递给...

    总结一下Intent概念

    总结一下Intent概念

    intent匹配规则大总结

    根据给定文件内容,我们可以总结以下具体的匹配规则: 1. **Category 必填性**: - `intent-filter` 中的 `category` 必须填写,否则程序将无法正常运行。 2. **多个Activity匹配**: - 当存在两个可以匹配的...

    Android Intent的几种用法全面总结

    本文将全面总结Intent的几种主要用法。 1. 显示网页: 使用`ACTION_VIEW`与Uri结合,可以打开指定URL的网页。例如: ```java Uri uri = Uri.parse("http://www.google.com"); Intent it = new Intent(Intent.ACTION...

    Intent系统调用示例

    总结,Intent是Android中至关重要的组件通信工具,理解并熟练运用Intent对于开发高效、稳定的Android应用至关重要。通过IntentDemo项目的学习,开发者可以更深入地掌握Intent的工作原理和应用场景。

    Android Intent Service BroadCast AndroidStudio

    本项目将Android中的Intent总结了一遍。主要有四个项目,Intent_Intent项目是简单的Intent跳转(setActivityResult);Intent_broadcast主要是静态广播的注册;Intent_broadcastdynamic主要介绍动态广播的注册;...

    android整合--intent

    在Android开发中,Intent是一种非常重要的组件...总结,Intent在Android开发中起着桥梁的作用,连接起各个组件,使得组件间能够高效地通信和协作。理解并熟练掌握Intent的使用,是提升Android应用开发能力的关键步骤。

    Intent的多种用法

    总结来说,Intent是Android系统中的核心组成部分,它的多种用法包括显式和隐式Intent的创建、Intent Filter的定义、数据的传递以及调用系统服务和第三方应用。熟练掌握Intent的使用,将有助于提升Android应用的交互...

    Intent 与 Intent Filters 实现外部调用

    总结起来,Intent和Intent Filters是Android中实现组件间通信的核心机制,它们使得不同应用之间的交互成为可能,而轻应用的概念则充分利用了这一特性,为用户提供便捷的服务体验。在实际开发中,理解并熟练掌握...

    Android学习总结-Intent详解.doc

    Intent在Android开发中扮演着至关重要的角色,它是四大组件(Activity、Service、BroadcastReceiver和ContentProvider)间通信的关键。Intent不仅用于应用间的交互,也可以在同一个应用内的不同组件之间传递信息。...

    android Intent的用法

    总结,Intent在Android开发中扮演着至关重要的角色,无论是启动组件、传递数据还是实现组件间的通信,都离不开Intent的使用。理解和熟练掌握Intent的用法,是成为一名合格的Android开发者的基础。通过不断地实践和...

Global site tag (gtag.js) - Google Analytics