android 学习笔记(一):Intent 和 Intent 过滤器 跟着API指南来学习

来源:互联网 发布:虚拟摄影棚软件 编辑:程序博客网 时间:2024/06/06 02:38

了解内容:如何构建Intent,并通过清单上的Intent过滤器来激活与此Intent匹配的组件(活动、服务、广播)

A.基本用途主要包括以下三个:

1.启动 Activity startActivity()【没有回调结果】

             startActivityForResult()【在 Activity 完成后收到结果,用onActivityResult()回调

参考:http://blog.csdn.net/tuke_tuke/article/details/50787706

2.启动服务:startService()启动服务执行一次性操作

         bindService()【服务旨在使用客户端-服务器接口

        【为了确保应用的安全性,启动 Service 时,请始终使用显式 Intent,且不要为服务声明 Intent 过滤器。

参考:http://blog.csdn.net/zhuangyalei/article/details/47083279

3.传递广播 sendBroadcast()、【无序的广播机制

       sendOrderedBroadcast() 【有序的发送广播的机制

       sendStickyBroadcast()【一种粘性广播,这个intent 没有周期限制

       sendBroadcastAsUser()用来区分不同的用户

参考:http://blog.csdn.net/sduliulun/article/details/50206155

B.Intent 类型:

显式 Intent:按名称(完全限定类名)指定要启动的组件。

                  【创建显式 Intent 启动 Activity 或服务时,系统将立即启动 Intent 对象中指定的应用组件。】

隐式 Intent 不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理它。

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

                   【隐式 Intent 指定能够在可以执行相应操作的设备上调用任何应用的操作。 如果您的应用无法执行该操作而其他应用可以,且您希望用户选取要使用的应用,则使用隐式 Intent 非常有用

C.构建 Intent(如何构建)

Intent 中包含的主要信息如下:

组件名称:显示Intent时候用到,没这个则为隐式的。

                【您可以使用目标组件的完全限定类名指定此对象,其中包括应用的软件包名称。 例如,com.example.ExampleActivity。您可以使用 setComponent()setClass()setClassName() 或 Intent 构造函数设置组件名称。

                 【 要创建显式 Intent,请为 Intent 对象定义组件名称 — Intent 的所有其他属性均为可选属性。

操作:指定要执行的通用操作(例如,“查看”或“选取”)的字符串。

       【可以指定自己的操作,但是,您通常应该使用由 Intent 类或其他框架类定义的操作常量。有关定义通用操作的常量,请参阅 Intent 类参考文档,其他操作在 Android 框架中的其他位置定义。例如,对于在系统的设置应用中打开特定屏幕的操作,将在 Settings 中定义。您可以使用 setAction() 或 Intent 构造函数为 Intent 指定操作。

       【如果定义自己的操作,请确保将应用的软件包名称作为前缀。 

例如:static final String ACTION_TIMETRAVEL="com.example.action.TIMETRVAEL】

数据:引用待操作数据和/或该数据 MIME 类型的 URI(Uri 对象)。提供的数据类型通常由 Intent 的操作决定。例如,如果操作是 ACTION_EDIT,则数据应包含待编辑文档的 URI。

        【要仅设置数据 URI,请调用 setData()。 要仅设置 MIME 类型,请调用 setType()。如有必要,您可以使用 setDataAndType() 同时显式设置二者。

类别:一个包含应处理 Intent 组件类型的附加信息的字符串。 您可以将任意数量的类别描述放入一个 Intent 中,但大多数 Intent 均不需要类别。

         【有关类别的完整列表,请参阅 Intent 类描述。您可以使用 addCategory() 指定类别

以上列出的这些属性(组件名称、操作、数据和类别)表示 Intent 的既定特征。 通过读取这些属性,Android 系统能够解析应当启动哪个应用组件。

但是,Intent 也有可能会一些携带不影响其如何解析为应用组件的信息。 Intent 还可以提供:

Extra:携带完成请求操作所需的附加信息的键值对。

          【您可以使用各种 putExtra() 方法添加 extra 数据,每种方法均接受两个参数:键名和值。您还可以创建一个包含所有 extra 数据的 Bundle 对象,然后使用 putExtras() 将Bundle 插入 Intent 中。

           【Intent 类为标准化的数据类型指定多个 EXTRA_* 常量。如需声明自己的 extra 键(对于应用接收的 Intent),请确保将应用的软件包名称作为前缀。 

标志:在 Intent 类中定义的、充当 Intent 元数据的标志。 标志可以指示 Android 系统如何启动 Activity(例如,Activity 应属于哪个任务),以及启动之后如何处理(例如,它是否属于最近的 Activity 列表)。如需了解详细信息,请参阅 setFlags() 方法。

D.显示应用选择器

要显示选择器,请使用 createChooser() 创建 Intent,并将其传递给 startActivity()

E.接收隐式 Intent

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

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

<action>
在 name 属性中,声明接受的 Intent 操作。该值必须是操作的文本字符串值,而不是类常量。
<data>
使用一个或多个指定数据 URI 各个方面(schemehostportpath 等)和 MIME 类型的属性,声明接受的数据类型。
<category>
在 name 属性中,声明接受的 Intent 类别。该值必须是操作的文本字符串值,而不是类常量。
注:为了接收隐式 Intent,必须将 CATEGORY_DEFAULT 类别包括在 Intent 过滤器中。 方法 startActivity() 和 startActivityForResult() 将按照已申明 CATEGORY_DEFAULT 类别的方式处理所有 Intent。 如果未在 Intent 过滤器中声明此类别,则隐式 Intent 不会解析为您的 Activity。

【注:对于所有 Activity,您必须在清单文件中声明 Intent 过滤器。但是,广播接收器的过滤器可以通过调用 registerReceiver() 动态注册。 稍后,您可以使用 unregisterReceiver() 注销该接收器。这样一来,应用便可仅在应用运行时的某一指定时间段内侦听特定的广播。】          【ACTION_MAIN,CATEGORY_LAUNCHER 这两个元素必须配对使用,Activity 才会显示在应用启动器中。

F:使用待定 Intent

使用待定 Intent 时,应用不会立即调用(如 startActivity())执行该 Intent。相反,通过调用相应的创建器方法创建 PendingIntent时,您必须声明所需的组件类型:

  • PendingIntent.getActivity(),适用于启动 Activity 的 Intent
  • PendingIntent.getService(),适用于启动 Service 的 Intent
  • PendingIntent.getBroadcast(),适用于启动 BroadcastReceiver 的 Intent

G:Intent 解析

操作测试:要指定接受的 Intent 操作,Intent 过滤器既可以不声明任何 <action> 元素,也可以声明多个此类元素。

要通过此过滤器,您在 Intent 中指定的操作必须与过滤器中列出的某一操作匹配。如果该过滤器未列出任何操作,则 Intent 没有任何匹配项,因此所有 Intent 均无法通过测试。 但是,如果 Intent 未指定操作,则会通过测试(只要过滤器至少包含一个操作)。

类别测试:要指定接受的 Intent 类别, Intent 过滤器既可以不声明任何 <category> 元素,也可以声明多个此类元素。若要使 Intent 通过类别测试,则 Intent 中的每个类别均必须与过滤器中的类别匹配。反之则未必然,Intent 过滤器声明的类别可以超出 Intent 中指定的数量,且 Intent 仍会通过测试。 因此,不含类别的 Intent 应当始终会通过此测试,无论过滤器中声明何种类别均是如此。

           【注:Android 会自动将 CATEGORY_DEFAULT 类别应用于传递给 startActivity() 和 startActivityForResult() 的所有隐式 Intent。因此,如需 Activity 接收隐式 Intent,则必须将 "android.intent.category.DEFAULT" 的类别包括在其 Intent 过滤器中(如上文的 <intent-filter> 示例所示)。】

数据测试:要指定接受的 Intent 数据, Intent 过滤器既可以不声明任何 <data> 元素,也可以声明多个此类元素。

每个 <data> 元素均可指定 URI 结构和数据类型(MIME 媒体类型)。 URI 的每个部分均包含单独的 schemehostport 和 path 属性:

<scheme>://<host>:<port>/<path>

例如:

content://com.example.project:200/folder/subfolder/etc

在此 URI 中,架构是 content,主机是 com.example.project,端口是 200,路径是 folder/subfolder/etc

在 <data> 元素中,上述每个属性均为可选,但存在线性依赖关系:

  • 如果未指定架构,则会忽略主机。
  • 如果未指定主机,则会忽略端口。
  • 如果未指定架构和主机,则会忽略路径。
将 Intent 中的 URI 与过滤器中的 URI 规范进行比较时,它仅与过滤器中包含的部分 URI 进行比较。路径规范可以包含星号通配符 (*),因此仅需部分匹配路径名即可。

H:Intent 匹配

通过 Intent 过滤器匹配 Intent,这不仅有助于发现要激活的目标组件,还有助于发现设备上组件集的相关信息。

PackageManager 提供了一整套 query...() 方法来返回所有能够接受特定 Intent 的组件:

queryIntentActivities() 将返回能够执行那些作为参数传递的 Intent 的所有 Activity 列表,

queryIntentServices() 则可返回类似的服务列表。

这两种方法均不会激活组件,而只是列出能够响应的组件。

queryBroadcastReceivers() 用于广播接收器,

 







阅读全文
0 0
原创粉丝点击