【问题标题】:What are Intent Filters exactly?什么是意图过滤器?
【发布时间】:2010-07-03 16:55:54
【问题描述】:

我已经阅读了很多关于意图过滤器的文章,但我真的无法准确理解它们的作用?

如果有人可以用一个清晰​​的例子向我解释一下意图过滤器的作用是什么?

谢谢

【问题讨论】:

标签: android intentfilter


【解决方案1】:

我认为这是有据可查的here。总而言之,当(例如)您将意图传递给 Context.startActivity 或 Context.startService,或使用 Context.sendBroadcast 等进行广播时,该意图传递给什么活动或服务(或者,哪组广播接收器)?

答案:如果意图是“显式”的,即它设置了组件名称字段,那么它会被传递到它指定的目标组件——这通常发生在应用程序内的通信中。

否则(“隐式”意图,如应用程序之间的典型通信),Android 必须自行确定最佳活动或服务(或一组接收器)。 Android 是如何做到这一点的?这就是过滤器的用武之地,我引用:

它通过比较内容来做到这一点 意图对象的意图 过滤器,与相关的结构 可能潜在的组件 接收意图。过滤器宣传 组件的能力和 划定它可以处理的意图。 他们打开组件到 接受隐含的可能性 广告类型的意图。如果一个 组件没有任何意图 过滤器,它只能接收显式 意图。带有过滤器的组件可以 接收显式和隐式 意图。

有问题的网页继续包含许多细节,最后是一个完整、简单的示例,我认为在这里复制和粘贴它们是多余的。

【讨论】:

  • 您能否给我一个示例,其中包含可以由许多活动处理的隐式意图的代码以及意图过滤器如何将处理限制为仅一个活动?
  • @Mina,我怎样才能在我已经指向的页面上的 Note Pad 示例中添加任何值,developer.android.com/guide/topics/intents/intents-filters.html ?!它有三个活动,每个活动都有意图过滤器,并且解释非常清楚(“代码”实际上都是 XML,当然)。将解释文本规范化为合理长度的行,超过 200 行(没有人指责 XML 过于简洁;-)——复制和粘贴大量可以在线阅读的大量文本的附加价值是什么你自己?!
  • 谢谢 Alex,但我想要的是一个可以由多个活动处理的 Intent 示例
  • @Mina,有问题的页面上的许多示例意图可以被多个活动接收,因此选择“最佳”的一个(实际上只广播 到多个组件——对于活动和服务,只选择“最好的”)。
  • @AlexMartelli 所以我可以说意图过滤器用于来自应用程序外部的通信或服务请求吗?
【解决方案2】:

简单地说,Intent 过滤器是一种告诉操作系统如何启动/与应用中不同的活动/服务/广播接收器通信的方式。例如,如果您希望以http://www.mycompany.com 开头的链接引导人们进入您的应用程序,那么意图过滤器就是实现此目的的方法。设置完成后,只要有人单击以该链接开头的链接(在任何应用程序中),用户都会看到使用您的应用程序查看该页面的选项。您可能已经通过 youtube 网址看到了这一点。同样,如果您希望许多应用程序中常见的“共享”链接列出您的应用程序,则可以使用意图过滤器来做到这一点。

希望这会有所帮助...

【讨论】:

  • 你能给我一个这样的意图过滤器的例子吗
【解决方案3】:

intent filter 让系统知道组件可以处理哪些数据或服务请求。组件可能是活动、服务或广播接收器。

如果您正在编写一个图像查看器,您可以在清单中添加一个(或多个)意图过滤器来描述您可以处理的图像。如果您正在编写文件浏览器,您可能会将图像文件的详细信息打包在一个意图中,系统将筛选意图过滤器,直到找到处理该图像的最佳匹配。对于可能从一个组件传递到下一个组件的任何类型的数据或服务也是如此。

【讨论】:

    【解决方案4】:

    意图过滤器是一种告诉操作系统让我处理/提供此类活动/服务的方式

    通过向 Manifest 添加给定的过滤器,告诉操作系统我也可以处理短信服务,并且每当您发送短信时,它都会显示在列表中,或者您也可以明确地将其用作短信服务。

    <intent-filter>
    
        <action android:name="android.intent.action.SENDTO" />
    
        <action android:name="com.example.code.SMS_INTENT" />
    
        <category android:name="android.intent.category.DEFAULT" />
    
        <data android:scheme="smsto" />
    
    </intent-filter>
    

    并且要显式使用此服务,请像...一样调用它

     Intent intent = new Intent("com.example.code.SMS_INTENT", Uri.parse(uri));
    
     intent.putExtra("from", "code");
    
     startActivity(intent);
    

    【讨论】:

      【解决方案5】:

      IntentFilters 用于声明声明组件将响应的 Intent 属性模式。您可以使用 IntentFilter 指定给定的 Activity、Service 或 BroadcastReceiver 将响应操作、数据 mime 类型、方案、路径等的组合。例如,如果您使用 IntentFilter 为数据类型为“text/plain”的 ACTION_SEND 注册 Activity ",每次用户想要发送一些文本时都会调用您的 Activity。

      【讨论】:

        【解决方案6】:

        intentFilters 通告组件的功能并定界 可以处理的意图。给定 Activity 的 IntentFilter, Service 或 BroadcastReceiver 将响应组合动作, 数据 mime 类型、方案、路径等。

        通过将意图与基于三个的意图过滤器进行比较的意图 方面:

        1:- 意图操作
        2:- 意图数据(URI 和数据类型)
        3:- 意图 类别

        action :
        以名称声明接受的意图操作 属性。该值必须是操作的文字字符串值, 不是类常量。

        数据:
        使用一个或多个声明接受的数据类型 指定数据 URI 各个方面的属性(方案、主机、 端口、路径等)和 MIME 类型。

        category :
        在名称中声明接受的意图类别 属性。该值必须是操作的文字字符串值, 不是类常量。

        例如,此活动处理带有文本数据的“发送”操作。

        <intent-filter>
            <action android:name="android.intent.action.SEND"/>
            <category android:name="android.intent.category.DEFAULT"/>
            <data android:mimeType="text/plain"/>
        </intent-filter>
        

        【讨论】:

        • 我们使用intent-filter来处理来自应用程序外部的请求?
        • 是的,当您的应用安装在设备上时,系统会识别您的意图过滤器并将信息添加到所有已安装应用支持的内部意图目录中。
        • 所以只是为了确认。如果我们不打算处理来自其他应用程序的外部请求。那么我们不需要使用intent-filter?
        • 不,我们确实需要意图过滤器。要在您的应用程序中启动新任务,您需要提及带有“android.intent.action.MAIN”和“android.intent.category.LAUNCHER”的过滤器以及默认为“android.intent.category.DEFAULT”的其他意图。即使您没有提及 category.DEFAULT android 也适用于所有隐式意图,仅作为 DEFAULT
        【解决方案7】:

        Intent 过滤器告诉 android 系统 android 组件(活动、服务、广播接收器)应该监听哪个 Intent 或事件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-02
          • 1970-01-01
          • 2017-05-21
          • 1970-01-01
          相关资源
          最近更新 更多