Android——Intent和Intent过滤器
http://www.cnblogs.com/XP-Lee/p/3613830.html
Intent就是一个激活组件的消息对象,用于组件之间的通信。需要注意的是,能被Intent激活通信的组件只有三类:Activity、Service和BroadcastReceiver。对应这三类组件,Intent
有下面三种使用场景:
- 启动Activity:在app中,一个Activity就代表一个用户界面。以
Intent
为参数调用startActivity()启动一个Activity实例。这个Intent告诉Activity去启动,并且传递了一些必要数据给它。在Activity结束时,如果想要从这个结束的Activity接收数据,可以使用startActivityForResult()启动,这样在你的Activity的
onActivityResult()
回调就会接收到单独的结果Intent。 - 启动Service:Service没有用户界面,它的职责就是在后台执行操作。以
Intent
为参数调用startService()
启动一个Activity实例。这个Intent告诉Service去启动,并且传递了一些必要数据给它。如果Service被设计成C/S结构的Server,你可以在其它组件中以Intent为参数调用bindService()绑定这个Service。
- 发送广播:一个广播消息是可以被任何app接收的。系统为各种系统事件发送广播,你也可以发送广播(
sendBroadcast()
,sendOrderedBroadcast()
, orsendStickyBroadcast()
)。
上述这些Intent传递,不会有重叠。广播Intent仅被传递给Receiver,永远不会给Activity或者Service;一个传送给Activity的Intent是只会被传递给Activity,永远不会给一个Service或Receiver;如此类推。
Intent类型(Intent Types)
Intent有两种类型:
- 显式Intent:使用全类名启动一个组件。显示Intent启动组件是在你自己的app当中的,因为需要知道一个组件的类名。
- 隐式Intent:不实用类名,而是通过action去启动。隐式Intent启动的组件允许来自于另一个app。
显式Intent启动,Android系统可以通过这个Intent对象立即启动组件。
隐式Intent启动,Android系统会将Intent的内容与设备所有app的manifest文件中的Intent过滤器比较,找出最合适的组件去启动。如果Intent和Intent过滤器匹配,系统就会启动组件并且传递Intent对象。如果有多个Intent过滤器匹配,系统会显示一个对话框,供用户选择使用哪一个app。(注,Intetn过滤器是manifest中的一个符号,指明一个组件可以接收什么样的Intent。)
上图为隐式Intent启动Activity的过程。【1】Activity A通过action创建一个Intent,让后以这个Intent为参数调用startActivity()。【2】Android系统会隐式Intent,搜索匹配所有app的Intent过滤。【3】系统匹配到Activity B,调用它的onCreate()方法并且传递Intent。
警告:为了确保app的安全性,通常使用显式Intent启动Service,并且不给Service声明Intetn过滤器。使用隐式Intent启动Service是危险的,因为你不可能确定多少个Service会响应这个Intetn,并且用户看不到哪个Service启动了。
创建Intent(Building an Intent)
Intent的主要信息如下:
Component name
启动的组件名称。
对于隐式启动来说,Component name是可选的。但是对于显示启动来说,Component name是必须的信息。没有Component name信息的Intent就是一个隐式的Intent,系统会基于Intent的其它信息(比如action、data、category)决定哪个组件来接收Intent。
Action
执行通用操作的字符串。
系统框架提供了许多action常量,下标列出部分内容:
常量 | 目标组件 | Action |
ACTION_CALL | Activity | 打电话 |
ACTION_SCREEN_ON | BroadcastReceiver | 屏幕开启 |
ACTION_TIMEZONE_CHANGED | BroadcastReceiver | 时区变化 |
自定义action,应该尽量使用包名作为前缀。比如:
1 static final String ACTION_TIMETRAVEL = "com.example.action.TIMETRAVEL";
Data
被执行数据的URI和它的MIME类型。通常,不同的action会伴随不同的数据类型。例如, 如果action为ACTION_EDIT, 那么Data将包含待编辑的数据URI. 如果action为ACTION_CALL, Data将为tel:电话号码的URI. 如果action为ACTION_VIEW, 则Data为http:网络地址的URI.
当创建一个Intent时,为数据指定一个MIME类型作为URI的补充,是非常必要的。比如,一个activity可以显示图片但是不能播放音频(尽管图片和音频的URI是非常相似的)。因此,为数据指定一个MIME类型可以帮助Android系统找到最佳的组件接收Intent。
然而,MIME类型有时候可以通过特别的URI推测出来。比如content:
URI,它表明数据位于设备上面,并且数据是被ContentProvider控制的,这就使的数据的MIME类型对系统来说是可见的。
警告:如果想要设置URI和MIME类型,应该调用setDataAndType()
;而不是同时调用setData()和setType(),因为它们会使彼此的值无效。
Category
一个附加信息的的字符串,包含了关于可以处理该Intent的组件种类信息。一个Intent可以有多个Category,但是大多数Intent需要Category。下面是一些公共Category信息:
常量 | 含义 |
CATEGORY_BROWSABLE | 目标activity可以被浏览器安全的启动,用来显示链接应用的数据——比如,一张图片或者一封邮件 |
CATEGORY_GADGET | 这个activity可以被嵌入到另一个activity中 |
CATEGORY_HOME | 这个activity电视home界面,即设备打开或者按Home键看到的第一个页面 |
CATEGORY_LAUNCHER | 这个activity可以作为task的初始activity,并且是被列应用程序启动器中 |
CATEGORY_PREFERENCE | 目标activity是一个选项面板 |
上面的内容(component name, action, data, and category)描述了Intent的典型特征。通过读取这些内容,Android系统可以决定哪个组件可以被启动。
然而,Intent还可以携带一些额外信息,这些额外信息不会影响系统选取组件,这些额外信息就是Extras和Flags。
Extras
Key-value形式的额外信息。
Intent类定义了许多的EXTRA_*
常量的标准数据类型。如果要自定义extra keys,应该尽量使用包名作为前缀:
1 static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";
Flags
flag被定义在Intent类中,它作为Intent的metadata(描述数据的数据)。flag可以告诉Android系统如何启动一个activity(比如,这个activity属于哪一个task),并且在启动后如何管理这个activity(比如,这个activity是否属于recent activities列表)。
使用待定Intent(Using a Pending Intent)
PendingIntent是对Intent的包装。PendingIntent的主要目的是授予外部程序使用被包装的Intent,好像Intent在自己的进程中执行。
pending intent的主要使用场景如下:
- 用户执行一个你的Notification相关的操作(Android系统的
NotificationManager会执行这个Intent)。
- 用户执行一个你的App Widget相关的操作(Home screen app会执行这个Intent)。
- 未来某一个特定时刻执行(Android系统的AlarmManager会执行这个Intent)。
由于Intent被设计成只有特定类型的组件(Activity、Service和BroadcastReceiver)才能处理,因此PendingIntent的创建也必须要基于这层考虑。创建PendingIntent时,必须根据组件类型的不同,分别调用对应的方法创建:
PendingIntent.getActivity()
for anIntent
that starts anActivity
.PendingIntent.getService()
for anIntent
that starts aService
.PendingIntent.getBroadcast()
for aIntent
that starts anBroadcastReceiver
.
这些方法最好使用当前app的Context。更多的关于PendingIntent的使用,参考Notifications和App Widgets的Api指南。
Intent解析(Intent Resolution)
当系统收到一个隐式Intent的时候,系统会通过比较Intent和Intent比较器寻找最佳的activity,系统基于以下三个方面来比较:
- action
- data(URI和数据类型——MIME)
- category
Action test
一个Intent过滤器可以声明零个或多个<action>
元素。比如:
1 <intent-filter>
2 <action android:name="android.intent.action.EDIT" />
3 <action android:name="android.intent.action.VIEW" />
4 ...
5 </intent-filter>
Android——Intent和Intent过滤器的更多相关文章
- Android开发-API指南-Intent和Intent过滤器
Intents and Intent Filters 英文原文:http://developer.android.com/guide/components/intents-filters.html 采 ...
- android 基础03 -- Intent
Android 中的 Intent 是将要执行的操作的一种抽象的描述,是一个用于Android 各个组件之间传递消息的对象. Intent 的基本用法 Intent 基本的使用方法主要有三种: 启动一 ...
- Android组件系列----Intent详解(转载笔记)
[正文] Intent组件虽然不是四大组件,但却是连接四大组件的桥梁,学习好这个知识,也非常的重要. 一.什么是Intent 1.Intent的概念: Android中提供了Intent机制来协助应用 ...
- Android组件系列----Intent详解
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- android学习五 Intent
1.Intent是组件间调用的桥梁. 2.Android系统定义了很多Intent http://developer.android.com/guide/components/intents-c ...
- android intent和intent action大全
1.Intent的用法:(1)用Action跳转1,使用Action跳转,如果有一个程序的AndroidManifest.xml中的某一个 Activity的IntentFilter段中 定义了包含了 ...
- Android安全之Intent Scheme Url攻击
0X01 前言 Intent scheme url是一种用于在web页面中启动终端app activity的特殊URL,在针对intent scheme URL攻击大爆发之前,很多android的浏览 ...
- Android复习笔记--Intent
Intent是Android中各组件跳转的重要方式,一般可悲用于启动活动.启动服务.以及发送广播等场景. #显示Intent 主要主要用于启动已知的组件 //发送方 Intent intent = ...
- Android 中的 Intent 简介
Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据. ------------------------------- ...
随机推荐
- Asp.Net MVC +EntityFramework主从表新增编辑操作的实现(删除操作怎么实现?)
Asp.Net MVC +EntityFramework主从表新增编辑操作的实现 对于MVC中同时对主从表的表单操作在网上现有的解决很少,而这样的操作在做业务系统中是经常为遇到的.我在网上搜索了很久都 ...
- python文件处理b模式
执行环境:windows+Python3.51.rb模式,从文件中读取内容,得到的是bytes类型 因为我们使用的是b模式,所以在open函数中不能指定编码格式,所以打印出来的格式的二进制的格式,而我 ...
- .6-浅析webpack源码之validateSchema模块
validateSchema模块 首先来看错误检测: const webpackOptionsValidationErrors = validateSchema(webpackOptionsSchem ...
- vue-cli脚手架搭建项目简单入门一
搭建系统: Windows系统 简单了解Node.js.npm,安装Node.js,下载网址:http://nodejs.cn/download/ 查看node,npm安装成功与否.打开cmd命令行, ...
- WebService学习概念总结
概念总结:WebSerevice是一种跨编程语言和跨操作系统平台的远程调用技术传输协议:HTTP技术构成:XML+XSD,SOAP,WSDL XML封装数据格式,解决数据表示问题 XSD定 ...
- 【Ueditor】富文本编辑使用
前提准备: 在http://ueditor.baidu.com/website/官网下载需要使用的版本.(我选用的1.4.3.1最新版本)因为这是以前做过的一个记录,现在移动到博客园保存记录.所有现在 ...
- Flume参数小结
名词解释: 1.netcat:通过网络端口获取数据,source的实现类 2.logger:将数据显示到控制台,sink的实现类 3.memory: ,channel的实现类 4.capacity:是 ...
- 01-初始Java
1. 你学习编程的目的是什么?学习编程最快的办法是什么? 答:我喜欢计算机,想更多的了解计算机的原理:我认为学习最快的办法就是尝试,只有不断地在计算机上尝试编程,遇到错误, 解决错误,才能更快的学会编 ...
- MEF 插件式开发之 DotNetCore 中强大的 DI
背景叙述 在前面几篇 MEF 插件式开发 系列博客中,我分别在 DotNet Framework 和 DotNet Core 两种框架下实验了 MEF 的简单实验,由于 DotNet Framewor ...
- Django Rest Framework之解析器
基本代码结构 urls.py: from django.conf.urls import url, include from web.views.s5_parser import TestView u ...