Intent 和 Intent 过滤器
2016-04-07 13:06
399 查看
参考官方文档:http://developer.android.com/guide/components/intents-filters.html
启动 Activity:
使用startActivity() 或 startActivityForResult()
启动Service
使用startService(),如果需要使用客户端-服务器接口,则将intent传递给bindService()
传递广播
使用 sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast()
按名称(完全限定类名)指定要启动的组件,显式 Intent 启动 Activity 或服务时,系统将立即启动 Intent 对象中指定的应用组件。
隐式 Intent
不会指定特定的组件,而是声明要执行的常规操作,隐式 Intent,系统通过将 Intent 的内容与在设备上其他应用的清单文件中声明的 Intent 过滤器进行比较,从而找到要启动的相应组件。
注意 :
使用隐式Intent启动 Service存在安全隐患,自API>21后,隐式 Intent 调用 bindService(),系统会抛出异常。
组件名称
如果没有组件名称,则 Intent 是隐式的。系统将根据其他 Intent 信息来启动 相应组件。
如需启动特定的组件,则应指定该组件的名称。
启动 Service 时,需要 始终指定组件名称
可以使用setComponent()、setClass()、setClassName() 或 Intent 构造函数设置组件名称
操作
要执行的通用操作,很大程度上决定了其余 Intent 的构成,特别是数据和 extra 中包含的内容.
ACTION_VIEW: 启动某项 Activity 向用户显示的信息
ACTION_SEND: 共享 Intent
可以使用 setAction() 或 Intent 构造函数来设置action
数据
待操作数据和/或该数据 MIME 类型的 URI(Uri 对象)
仅设置数据 URI,调用 setData()
仅设置 MIME 类型,请调用 setType()
setDataAndType() 同时显式设置二者,如安装apk
要同时设置 URI 和 MIME 类型,不能调用 setData() 和 setType(),因为它们会互相抵消彼此的值
类别
附加信息字符串,大多数 Intent 均不需要类别
CATEGORY_BROWSABLE 允许本身通过 Web 浏览器启动。
CATEGORY_LAUNCHER 任务的初始 Activity,在系统的应用启动器中会列出
可以使用 addCategory() 指定类别
Extra
附加信息的键值对
putExtra(),添加键值对
putExtras(), 添加bundle
标志
Intent 元数据标志
setFlags (int flags):如指定启动模式等等
使用createChooser()强制使用应用选择器
显式 Intent 始终会传递给其目标,无论组件声明的 Intent 过滤器如何均是如此。
为了接收隐式 Intent,必须将 CATEGORY_DEFAULT 类别包括在 Intent 过滤器中。方法 startActivity() 和 startActivityForResult() 将按照已申明 CATEGORY_DEFAULT 类别的方式处理所有 Intent。
如果未在 Intent 过滤器中声明此类别,则隐式 Intent 不会解析为您的 Activity。
确保只有自己的应用才能启动某一组件,需要该组件将 exported 属性设置为 “false”
NotificationManager执行的Intent
应用小工具执行操作时要执行的 Intent(主屏幕应用执行 Intent)
某一特定时间要执行的 Intent(Android 系统的 AlarmManager 执行 Intent)
声明所需组件类型
queryIntentActivities() :将返回能够执行那些作为参数传递的 Intent 的所有 Activity 列表
queryIntentServices(): 则可返回类似的服务列表。
queryBroadcastReceivers():列出广播接收器列表
概述
Intent 是一个消息传递对象,用于组件之间的通信。启动 Activity:
使用startActivity() 或 startActivityForResult()
启动Service
使用startService(),如果需要使用客户端-服务器接口,则将intent传递给bindService()
传递广播
使用 sendBroadcast()、sendOrderedBroadcast() 或 sendStickyBroadcast()
intent类型
显式 Intent按名称(完全限定类名)指定要启动的组件,显式 Intent 启动 Activity 或服务时,系统将立即启动 Intent 对象中指定的应用组件。
隐式 Intent
不会指定特定的组件,而是声明要执行的常规操作,隐式 Intent,系统通过将 Intent 的内容与在设备上其他应用的清单文件中声明的 Intent 过滤器进行比较,从而找到要启动的相应组件。
注意 :
使用隐式Intent启动 Service存在安全隐患,自API>21后,隐式 Intent 调用 bindService(),系统会抛出异常。
构建 Intent
一个Intent包含 如下信息:组件名称
如果没有组件名称,则 Intent 是隐式的。系统将根据其他 Intent 信息来启动 相应组件。
如需启动特定的组件,则应指定该组件的名称。
启动 Service 时,需要 始终指定组件名称
可以使用setComponent()、setClass()、setClassName() 或 Intent 构造函数设置组件名称
操作
要执行的通用操作,很大程度上决定了其余 Intent 的构成,特别是数据和 extra 中包含的内容.
ACTION_VIEW: 启动某项 Activity 向用户显示的信息
ACTION_SEND: 共享 Intent
可以使用 setAction() 或 Intent 构造函数来设置action
数据
待操作数据和/或该数据 MIME 类型的 URI(Uri 对象)
仅设置数据 URI,调用 setData()
仅设置 MIME 类型,请调用 setType()
setDataAndType() 同时显式设置二者,如安装apk
要同时设置 URI 和 MIME 类型,不能调用 setData() 和 setType(),因为它们会互相抵消彼此的值
类别
附加信息字符串,大多数 Intent 均不需要类别
CATEGORY_BROWSABLE 允许本身通过 Web 浏览器启动。
CATEGORY_LAUNCHER 任务的初始 Activity,在系统的应用启动器中会列出
可以使用 addCategory() 指定类别
Extra
附加信息的键值对
putExtra(),添加键值对
putExtras(), 添加bundle
标志
Intent 元数据标志
setFlags (int flags):如指定启动模式等等
注意事项
使用隐式 Intent 前,需要调用一下resolveActivity()判断结果非空,否则没有任何应用处理Intent,应用会崩溃。使用createChooser()强制使用应用选择器
显式 Intent 始终会传递给其目标,无论组件声明的 Intent 过滤器如何均是如此。
Intent sendIntent = new Intent(Intent.ACTION_SEND); ... // Always use string resources for UI text. // This says something like "Share this photo with" String title = getResources().getString(R.string.chooser_title); // Create intent to show the chooser dialog Intent chooser = Intent.createChooser(sendIntent, title); // Verify the original intent will resolve to at least one activity if (sendIntent.resolveActivity(getPackageManager()) != null) { startActivity(chooser); }
接收隐式 Intent
接收隐式 Intent,在清单文件中使用 元素,仅当隐式 Intent 可以通过 Intent 过滤器之一传递时,系统才会将该 Intent 传递给应用组件为了接收隐式 Intent,必须将 CATEGORY_DEFAULT 类别包括在 Intent 过滤器中。方法 startActivity() 和 startActivityForResult() 将按照已申明 CATEGORY_DEFAULT 类别的方式处理所有 Intent。
如果未在 Intent 过滤器中声明此类别,则隐式 Intent 不会解析为您的 Activity。
确保只有自己的应用才能启动某一组件,需要该组件将 exported 属性设置为 “false”
待定 Intent
PendingIntent 对象是 Intent 对象的包装器,用例:NotificationManager执行的Intent
应用小工具执行操作时要执行的 Intent(主屏幕应用执行 Intent)
某一特定时间要执行的 Intent(Android 系统的 AlarmManager 执行 Intent)
声明所需组件类型
PendingIntent.getActivity();//适用于启动 Activity 的 Intent。 PendingIntent.getService();//适用于启动 Service 的 Intent。 PendingIntent.getBroadcast();//适用于启动 BroadcastReceiver 的 Intent。
Intent 匹配
PackageManagerqueryIntentActivities() :将返回能够执行那些作为参数传递的 Intent 的所有 Activity 列表
queryIntentServices(): 则可返回类似的服务列表。
queryBroadcastReceivers():列出广播接收器列表
相关文章推荐
- CodecContext->gop_size 是什么
- QT中QPainter的使用及矩形、圆形等常见图形的画法
- java算法之身份证号码验证
- 此生非VR不娶(VR介绍与探讨)
- Python:IOError: image file is truncated 的解决办法
- CentOS7下源码安装5.6.23
- 《Linux内核设计与实现》第七章读书笔记
- 数据结构——动态链表(C++)
- 分享一个超酷的在线协同工具
- LeetCode 15 3Sum
- 数据结构——动态链表(C++)
- CentOS7下yum方式安装mysql5.6
- 旧文备份:CANopen协议中SDO服务
- 关于快速报错fail-fast想说的之fail-fast的避免方法(二)
- hdu 1533 Going Home(zkw费用流)
- nginx学习之自旋锁nginx_spinlock
- COM:The Open Dialog Box
- iOS程序员必读之热门书单
- 处理session跨域几种的方案
- MyBatis一级缓存引起的无穷递归