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
Intent 类型:B.
显式 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>
scheme
、host
、port
、path
等)和 MIME 类型的属性,声明接受的数据类型。<category>
name
属性中,声明接受的 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 的每个部分均包含单独的 scheme
、host
、port
和 path
属性:
<scheme>://<host>:<port>/<path>
例如:
content://com.example.project:200/folder/subfolder/etc
在此 URI 中,架构是 content
,主机是 com.example.project
,端口是 200
,路径是 folder/subfolder/etc
。
在 <data>
元素中,上述每个属性均为可选,但存在线性依赖关系:
- 如果未指定架构,则会忽略主机。
- 如果未指定主机,则会忽略端口。
- 如果未指定架构和主机,则会忽略路径。
H:Intent 匹配
通过 Intent 过滤器匹配 Intent,这不仅有助于发现要激活的目标组件,还有助于发现设备上组件集的相关信息。
PackageManager
提供了一整套 query...()
方法来返回所有能够接受特定 Intent 的组件:
queryIntentActivities()
将返回能够执行那些作为参数传递的 Intent 的所有 Activity 列表,
queryIntentServices()
则可返回类似的服务列表。
这两种方法均不会激活组件,而只是列出能够响应的组件。
queryBroadcastReceivers() 用于广播接收器,
- android 学习笔记(一):Intent 和 Intent 过滤器 跟着API指南来学习
- Android 开发中 Intent 和 Intent 过滤器学习笔记
- 安卓学习笔记(五):任务和返回栈 跟着API指南来学习
- 安卓学习笔记(八):进程和线程 跟着API指南来学习
- Android学习笔记-Intent(一)
- Android学习笔记-Intent(一)
- 安卓API指南之Intent 和 Intent 过滤器
- Intent学习笔记(一)
- Android -- Intent 和 Intent 过滤器
- Android Intent和Intent过滤器
- 安卓学习笔记(四):加载器Loaders 跟着API指南来学习
- 安卓学习笔记(六):Overview Screen 概览屏幕 跟着API指南来学习
- 安卓学习笔记(七):服务 跟着API指南来学习
- 安卓学习笔记(八):内容提供者 跟着API指南来学习
- Android学习笔记--Intent
- android学习笔记---Intent
- Android学习笔记 - Intent
- Android学习笔记(一)-------浅谈Intent思路
- 【Java】Java从网络读取图片并保存至本地
- 内存泄漏检测
- Hive存储过程HQL/SQL(一)–hplsql命令行
- 你在职场可能犯下的最大错误
- android sp wp 解析
- android 学习笔记(一):Intent 和 Intent 过滤器 跟着API指南来学习
- 彻底解决Make sure other views do not use the same id问题
- 为工厂分配用于公司间开票的销售范围
- 5月16日云栖精选夜读:从0到1构建大数据生态系列1:数据蛮荒中的拓荒之举
- 对象的创建、回收、new和malloc
- 用opencsv文件读写CSV文件
- MapReduce和Hive支持递归子目录作为输入
- Android 监听短信(同时监听广播和数据库)
- csu----超市购物