`
zckai
  • 浏览: 18634 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Intent filters

阅读更多

==================================================

Intent的分类

==================================================

Intent大体上可以分成两类

*.  显式Intent,它通过组件名来指定要运行的目标组件(通过它的setComponent()方法),

    因为指定了组件名,所以它要运行的组件是确定的;其它程序开发者并不知道某个程序

    组件的名字,所以显式Intent通常用于程序内的组件调用,比如启动同一程序的其他

    服务或Activity。

*.  隐式Intent, 它不通过组件名来启动目标组件, 系统必须通过其他的手段找到合适的

    目标组件, 隐式Intent一般用于启动其他程序的组件.


===================================================

Intent filters

===================================================

如上所说, 对于隐式Intent不指定目标组件名,  Android必须用其他方法来找到目标组件,

这需要Intent和组件提供必要的信息.

对于组件来说, 它可以包含多个Intent filter, 这些Intent filter告知系统它可以处理

哪些Intent. 隐式Intent必须通过组件的Intent fitler测试才能启动该组件.

组件可以在AndroidManifest.xml指定它的Intent filter, 它包含action, data, category

三种Filter, 与Intent的这三种属性对应, 如:

    <activity . . .>

        <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" />

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

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

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

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

            . . . 

        </intent-filter>

    </activity>

一个Intent必须通过三种Filter的测试才能调用该组件, 但上面可以看到每种Filter可以

有多项, 对于每种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必须匹配Filter的Action列表中的一项, 才能通过, 如果Intent或

    组件的Filter没有指定Action, 会导致下两个结果:

    *.  如果组件的Intent Filter没有指定任何Action, 那么所有Intent都将不通过测试.

    *.  但另一方面,  如果Intent没有指定Action, 则它将通过测试, 即使组件的Intent

        Filter没有指定任何Action.


*.  Category测试

    <intent-filter . . . >

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

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

        . . .

    </intent-filter>

    一个Intent如果要通过测试, 则它包含的所有category都必须通过Filter的category列表

    中的一项. 因此, 如果一个Intent没有category, 它就总是可以通过测试. 但有一个

    例外的情况: 对于传递给Activity(调用startActivity())的隐式Intent, 系统默认它

    带有一个 android.intent.category.DEFAULT 的category, 所以Activity的Intent Filter

    必须包含一项 android.intent.category.DEFAULT, 才能使这个Intent通过测试. 

    不过如果Activity的Intent Filter带有 android.intent.action.MAIN 和

    android.intent.category.LAUNCHER , 就不再需要包含android.intent.category.DEFAULT 了.


*.  Data测试

    <intent-filter . . . >

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

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

        . . .

    </intent-filter>

    Data测试主要是测URI和数据类型(mimeType), URI的形式大概如下:

        scheme://host:port/path

    比如:

        http://www.douban.com:8080/people

    data filter将URI分成多个属性, 如下:

        <data android:host="string"

            android:mimeType="string"

            android:path="string"

            android:pathPattern="string"

            android:pathPrefix="string"

            android:port="string"

            android:scheme="string" />

    系统只比较出现的URI属性, 比如Data Filter只指定android:scheme, 那么所有包含

    这个scheme的URI都可以匹配这个Filter.


    Data的测试规则如下:

    *.  如果一个Intent没有包含URI和数据类型, 那么只当Data Filter也没有包含任何URI

        和数据类型时才能通过.

    *.  如果一个Intent包含URI但没有包含数据类型(并且数据类型不能从URI推断出来), 

        那么只当Intent的URI与Filter的URI匹配, 并且Filter也没有数据类型时才能通过.

    *.  如果一个Intent包含数据类型但没有包含URI, 那么只当Filter包含同样的数据

   <script type="text/javascript"></script><script type="text/javascript"></script><script type="text/javascript"></script><script type="text/javascript"></script><script type="text/javascript"></script> amp;nbsp;    类型并且没有包含URI时才能通过.

    *.  如果一个Intent即包含URI也包含数据类型(或可以从URI推断出数据类型), 那么

        当它匹配Filter的数据类型时通过数据类型部分的测试, 当它匹配Filter的URI时

        通过URI部分的测试; 

        如果Intent的URI是content: 或 file: , 并且Filter没有指定URI时通过URI测试,

        换名话说, 一个Filter只列出数据类型, 则假定支持content: 或 file: 类型的URI.

分享到:
评论

相关推荐

    Intent 与 Intent Filters 实现外部调用

    在Android开发中,Intent和Intent Filters是两个至关重要的概念,它们是应用程序之间通信的主要桥梁,也是实现外部调用的关键机制。下面将详细讲解Intent和Intent Filters的工作原理以及如何使用它们来实现外部调用...

    Android Intents and Intent Filters(一)

    Android Intents and Intent Filters(一) 对应博客地址:http://blog.csdn.net/michael__li/article/details/6947545

    Android开发之旅 Intents和Intent Filters(实例部分)(免费)

    ### Android开发之旅:深入理解Intents与Intent Filters 在Android开发中,`Intents`与`Intent Filters`是实现组件间通信的关键技术。通过这两项技术,开发者可以让应用程序中的不同组件,甚至不同的应用程序之间...

    Intents and Intent Filters 理论中英双文

    内含四个pdf文件,分别为 Intent and Intent-filter Intents and Intent Filters理论英文 Intents and Intent Filters理论中文 Intent入门指南 详尽介绍关于android intent

    Android系列教程之十二:Intents and Intent Filters(三).docx

    Intent Filters则是接收Intent的组件(如Activity、Service等)用来声明它们能处理的Intent类型。本教程将深入讲解Intent和Intent Filters,特别是如何利用它们进行数据检测。 在Intent Filter中,`&lt;data&gt;`标签用于...

    Android Intents and Intent Filters(二)源代码

    Android Intents and Intent Filters(二)源代码 对应博客 http://blog.csdn.net/michael__li/article/details/6950127

    android intent and intent-filters

    Intent-Filters则是定义组件如何响应Intent的一种机制,允许系统根据Intent的类型来启动相应的组件。本篇文章将深入探讨Android的Intent与Intent-Filters,并通过实例解析它们的工作原理。 首先,Intent分为显式...

    Android_intent_大全

    6. **Intent Filters**:在AndroidManifest.xml中,通过intent-filter标签定义组件能响应哪些Intent,包括Action、Category和Data,使得其他应用可以通过隐式Intent调用组件。 7. **startActivity()** 和 **...

    Android-Intents-3

    2. **配置Intent Filters**:为了能够通过Intent启动该Activity,需要在AndroidManifest.xml中为每个Tab对应的Activity配置Intent Filters。 3. **发送Intent**:在启动Activity时,通过Intent指定要显示的Tab。 ##...

    Android开发之旅

    Android开发之旅:环境搭建及HelloWorld 1 Android开发之旅:HelloWorld项目的目录结构 2 Android开发之旅:android架构 3 Android开发之旅:应用程序...Android开发之旅 Intents和Intent Filters(实例部分) 17

    Android开发指南中文版

    意图和意图过滤器Intents and Intent Filters 43 意图过滤器Intent filters 47 通常情况Common cases 51 使用意图匹配Using intent matching 52 数据存储Data Storage 52 概览Storage quickview 52  系统偏好:...

    Android开发宝典.rar

    意图和意图过滤器Intents and Intent Filters 43 意图过滤器Intent filters 47 通常情况Common cases 51 使用意图匹配Using intent matching 52 数据存储Data Storage 52 概览Storage quickview 52  系统...

    Android开发入门与实战+和第二版部分章节+第二版源代码

    本书主要内容为:Android开发环境搭建、Android SDK介绍、Android应用程序结构剖析,并对Android 中最重要的组件Activity、Intents&Intent Filters&Broadcast receivers、Intent、Service、Content Providers进行了...

    Android-Intents-1

    **Intent Filters** 是定义在 AndroidManifest.xml 文件中的,它们指定了一个组件(如 Activity)能够响应哪些类型的 Intent。每个 Intent Filter 都包括一组 action、data 和 category 属性,用于与发送的 Intent ...

    api中文翻译

    2. **Intents and Intent Filters**:详细介绍了Intent的工作原理以及如何使用Intent Filters来过滤和匹配Intent。 3. **Activities**:专门讲解了Activity组件的使用方法,包括生命周期管理等内容。 #### 五、总结...

    【Android开发API】应用的组成部分-意图和意图过滤器.pdf

    **Intent过滤器(Intent Filters)** 由于Intent并没有明确指定目标组件,Android系统依赖Intent过滤器(Intent Filter)来决定哪个组件应该接收特定的Intent。Intent过滤器在AndroidManifest.xml文件中定义,它们描述...

Global site tag (gtag.js) - Google Analytics