Intent

来源:互联网 发布:淘宝联盟导购id 编辑:程序博客网 时间:2024/06/06 03:40

Intent和IntentFilter

Android官方文档地址 :https://developer.android.com/guide/components/intents-filters.html#Receiving

Intent是一个消息传递对象,可以使用它对应用组件请求操作,Intent可以使用多种方式促进组件之间的通信,但其基本用例主要包括以下三个:

  • 启动Activity

    startActivity(intent);startActivityForResult(intent);  //当activity需要返回结果时调用
  • 启动Services

    startServices(intent);  bindServices(intent); 
  • 发送广播(BroadCastReciver)

Intent类型

Intent有两种类型,显示和隐式.

  • 显示Intent : 显示Intent按名称(类名)启动指定的组件:例如:启动Activity来响应用户操作启动Services来处理下载操作.

  • 隐式Intent : 不会指定类名,而是声明要进行的操作,调用其他应用中的组件来处理.

    创建隐式 Intent 时,Android 系统通过将 Intent 的内容与在设备上其他应用的清单文件中声明的 Intent 过滤器进行比较,从而找到要启动的相应组件。 如果 Intent 与 Intent 过滤器匹配,则系统将启动该组件,并向其传递 Intent 对象。 如果多个 Intent 过滤器兼容,则系统会显示一个对话框,支持用户选取要使用的应用.

    Intent 过滤器是应用清单文件中的一个表达式,它指定该组件要接收的 Intent 类型。 例如,通过为 Activity 声明 Intent 过滤器,您可以使其他应用能够直接使用某一特定类型的 Intent 启动 Activity。同样,如果您没有为 Activity 声明任何 Intent 过滤器,则 Activity 只能通过显式 Intent 启动.

  • 注意 : 为了确保应用的安全性,启动 Service 时,请始终使用显式 Intent,且不要为服务声明 Intent 过滤器。使用隐式 Intent 启动服务存在安全隐患,因为您无法确定哪些服务将响应 Intent,且用户无法看到哪些服务已启动。从 Android 5.0(API 级别 21)开始,如果使用隐式 Intent 调用 bindService(),系统会引发异常

Intent-Filter

要公布应用可以接收哪些隐式 Intent,请在清单文件中使用 元素为每个应用组件声明一个或多个 Intent 过滤器。每个 Intent 过滤器均根据 Intent 的操作、数据和类别指定自身接受的 Intent 类型。 仅当隐式 Intent 可以通过 Intent 过滤器之一传递时,系统才会将该 Intent 传递给应用组件。

应用组件应当为自身可执行的每个独特作业声明单独的过滤器。例如,图像库应用中的一个 Activity 可能会有两个过滤器,分别用于查看图像和编辑图像。 当 Activity 启动时,它将检查 Intent 并根据 Intent 中的信息决定具体的行为(例如,是否显示编辑器控件)。

每个 Intent 过滤器均由应用清单文件中的 元素定义,并嵌套在相应的应用组件(例如, 元素)中。 在 内部,您可以使用以下三个元素中的一个或多个指定要接受的 Intent 类型:

  • action :
    在 name 属性中,声明接受的 Intent 操作。该值必须是操作的文本字符串值,而不是类常量。

  • data :
    使用一个或多个指定数据 URI 各个方面(scheme、host、port、path 等)和 MIME 类型的属性,声明接受的数据类型。

  • category :
    在 name 属性中,声明接受的 Intent 类别。该值必须是操作的文本字符串值,而不是类常量。

    注:为了接收隐式 Intent,必须将 CATEGORY_DEFAULT 类别包括在 Intent 过滤器中。 方法 startActivity() 和 startActivityForResult() 将按照已申明 CATEGORY_DEFAULT 类别的方式处理所有 Intent。 如果未在 Intent 过滤器中声明此类别,则隐式 Intent 不会解析为您的 Activity。

0 0
原创粉丝点击