Intent的作用:使你的程序通过Intent调用相应的组件。
Intent(意图)的概念:表示我们要执行的某个操作。例如:查看某联系人的详细资料,发邮件给某人并传送一个文件,打电话给某人说某事。
Intent通过下面的属性来描述以上的某个意图:
1、Action(动作):用来表示意图的动作,如:查看,发邮件,打电话
2、category(类别):用来表示动作的类别。
3、data(数据):表示与动作要操作的数据。如:查看 联系人
4、type(数据类型):对data类型的描述。
5、extras(附件信息):附件信息。如:详细资料,一个文件,某事。
6、component(目标组件):目标组件。
android内置的Intent的各属性见google文档或http://book.51cto.com/art/200908/142683.htm
Intent的生成和各属性设置:见API
工作原理:你的程序向Android发送一个Inent请求,Android会根据Intent的内容在注册的IntentFilter中选择适当的组件来响应。比如,有一个Activity希望打开网页浏览器查看某一网页的内容,那么这个Activity只需要发出WEB_SEARCH_ACTION请求给Android,Android会根据Intent的请求内容,查询各组件注册时声明的IntentFilter,找到网页浏览器Activity来浏览网页。
详细过程如下:
1、调用者生成Intent对象,并设置相关属性。生成的Intent分为以下两种:
显示Intent:对于明确指出了目标组件名称的Intent(调用setComponent或setClass来指定)。
隐式Intent:对于没有明确指出目标组件名称的Intent。于隐式Intent,由于没有明确的目标组件名称,所以必须包含足够的属性信息,他们是:Action,Data,Category。再由Android系统帮助应用程序寻找与Intent请求意图最匹配的组件。
2、向Android提交Intent请求:
根据要调用的组件不同,请求方式不同:startActivity(Intent),startServer(Intent),sendBroadcast(Intent)。
3、Android对Intnt进行解析,选择相应的组件进行相应。这里可以选择多个组件进行相应。
对于显示Intent,已经明确定义了目标组件的名称,直接调用目标组件响应即可。
对于隐形Intnt,具体的选择方法是:Android将Intent的属性和一个叫做IntentFilter的过滤器比较,IntentFilter中包含系统中所有可能的待选组件。如果IntentFilter中某一组件匹配隐式Intent请求的内容,那么Android就选择该组件作为该隐式Intent的目标组件。
4、注册目标组件,配置IntentFilter。
是目标组件在Android-Manifest.xml中声明自己所含组件的过滤器(即可以匹配哪些Intent请求)。一个没有声明Intent-Filter的组件只能响应指明自己名字的显式Intent请求,而无法响应隐式Intent请求。而一个声明了IntentFilter的组件既可以响应显式Intent请求,也可以响应隐式Intent请求。在通过和IntentFilter比较来解析隐式Intent请求时,Android将以下三个因素作为选择的参考标准。Action,Data,Category。而Extra和Flag在解析收到Intent时是并不起作用的。
应用程序的组件为了告诉Android自己能响应、处理哪些隐式Intent请求,可以声明一个甚至多个IntentFilter。每个IntentFilter描述该组件所能响应Intent请求的能力——组件希望接收什么类型的请求行为,什么类型的请求数据。比如之前请求网页浏览器这个例子中,网页浏览器程序的IntentFilter就应该声明它所希望接收的Intent Action是WEB_SEARCH_ACTION,以及与之相关的请求数据是网页地址URI格式。
如何为组件声明自己的IntentFilter? 常见的方法是在AndroidManifest.xml文件中用属性<Intent-Filter>描述组件的IntentFilter。
前面我们提到,隐式Intent和IntentFilter进行比较时的三要素是Intent的Action、Data以及Category。实际上,一个隐式Intent请求要能够传递给目标组件,必要通过这三个方面的检查。如果任何一方面不匹配,Android都不会将该隐式Intent传递给目标组件。接下来我们讲解这三方面检查的具体规则。
1.动作测试
<intent-filter>元素中可以包括子元素<action>,比如:
view plaincopy to clipboardprint?
<intent-filter>
<action android:name="com.example.project.SHOW_CURRENT" />
<action android:name="com.example.project.SHOW_RECENT" />
<action android:name="com.example.project.SHOW_PENDING" />
</intent-filter>
<intent-filter>
<action android:name="com.example.project.SHOW_CURRENT" />
<action android:name="com.example.project.SHOW_RECENT" />
<action android:name="com.example.project.SHOW_PENDING" />
</intent-filter>
一条<intent-filter>元素至少应该包含一个<action>,否则任何Intent请求都不能和该<intent-filter>匹配。
如果Intent请求的Action和<intent-filter>中个某一条<action>匹配,那么该Intent就通
过了这条<intent-filter>的动作测试。
如果Intent请求或<intent-filter>中没有说明具体的Action类型,那么会出现下面两种情况。
(1) 如果<intent-filter>中没有包含任何Action类型,那么无论什么Intent请求都无法和这条<intent-filter>匹配。
(2) 反之,如果Intent请求中没有设定Action类型,那么只要<intent-filter>中包含有Action类型,这个Intent请求就将顺利地通过<intent-filter>的行为测试。
2.类别测试
<intent-filter>元素可以包含<category>子元素,比如:
view plaincopy to clipboardprint?
<intent-filter . . . >
<category android:name="android.Intent.Category.DEFAULT" />
<category android:name="android.Intent.Category.BROWSABLE" />
</intent-filter>
<intent-filter . . . >
<category android:name="android.Intent.Category.DEFAULT" />
<category android:name="android.Intent.Category.BROWSABLE" />
</intent-filter>
只有当Intent请求中所有的Category与组件中某一个IntentFilter的<category>完全匹配时,才会让该Intent请求通过测试,IntentFilter中多余的<category>声明并不会导致匹配失败。一个没有指定任何类别测试的IntentFilter仅仅只会匹配没有设置类别的Intent请求。
3.数据测试
数据在<intent-filter>中的描述如下:
view plaincopy to clipboardprint?
<intent-filter . . . >
<data android:type="video/mpeg" android:scheme="http" . . . />
<data android:type="audio/mpeg" android:scheme="http" . . . />
</intent-filter>
<intent-filter . . . >
<data android:type="video/mpeg" android:scheme="http" . . . />
<data android:type="audio/mpeg" android:scheme="http" . . . />
</intent-filter>
<data>元素指定了希望接受的Intent请求的数据URI和数据类型,URI被分成三部分来进行匹配:scheme、authority和path。其中,用setData()设定的Intent请求的URI数据类型和scheme必须与IntentFilter中所指定的一致。若IntentFilter中还指定了authority或path,它们也需要相匹配才会通过测试。
显式Intent直接用组件的名称定义目标组件,这种方式很直接。显式Intent多用于在应用程序内部传递消息。比如在某应用程序内,一个Activity启动一个Service。隐式Intent恰恰相反,由于开发人员往往并不清楚别的应用程序的组件名称,它不会用组件名称定义需要激活的目标组件,它更广泛地用于在不同应用程序之间传递消息。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fenghome/archive/2010/07/31/5777855.aspx
分享到:
相关推荐
4. **读取/写入NDEF标签**:使用`NfcAdapter`的`writeNdefMessage()`或`readNdefTag()`方法与NFC标签交互。 5. **卡模拟**:通过`NfcAdapter`的`enableForegroundDispatch()`和`disableForegroundDispatch()`控制...
同时,微信官方可能会对频繁调用扫一扫功能进行限制,因此在实际使用时,需要注意合理控制调用频率。 此外,`wechat-scanner-master`和`wechat-scanner`可能是两个开源项目,它们可能提供了封装好的微信扫一扫功能...
话框,因为你的应用程序并没有给自己机会来处理输入事件或者Intent广播。 因此,运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在 它的关键生命周期方法(如onCreate()和onResume())里尽可能少的...
首先,Android程序框架的核心组件是Activity,它是应用程序与用户交互的窗口。在创建项目时,通常会在"Create Activity"中指定一个Activity子类,例如这里的`HelloAndroid`。Activity是一个可执行的类,当用户启动...
【标题】创建一个简单的Widget(转载自mars) 在Android系统中,Widget是应用程序与桌面环境交互的一种方式,它允许用户在主屏幕上放置小型的应用程序视图,这些视图可以显示实时信息并提供有限的交互功能。这篇...
实验三 活动与intent的使用 实验四 碎片使用 实验五 广播应用 实验六 SQLite和SQLiteDatabase应用 实验七 多媒体应用 实验八 服务应用 (初学者的实验报告,仅供学习分享,谢绝商业转载,文件只有十个word文档)
这篇博文可能探讨了如何利用ActivityGroup来构建类似TabHost的功能,因为TabHost是Android SDK提供的一种用于在多个视图之间切换的布局管理器,通常与TabWidget结合使用,以实现具有标签页的用户界面。 ...
自定义URL协议允许开发者创建自己的协议前缀,例如"myapp://",当用户在浏览器或其他支持URL的应用程序中输入这样的地址时,系统会根据注册的处理程序来执行相应的操作。这为开发者提供了极大的灵活性,能够集成各种...
总的来说,这个教程不仅适合RPA初学者,也对有一定经验的开发者有很高的参考价值,因为它将理论与实践紧密结合,让你在掌握RPA技术的同时,也能了解前沿的AI和NLP应用。在学习过程中,记得充分利用评论区进行互动,...
这本书采用创新的CC BY-NC-ND授权方式,鼓励读者分享链接,但禁止未经许可的转载或商业使用。 入门章节介绍了Android的基本概念,包括如何安装Android开发工具,并通过实例指导读者开始开发Android应用。读者将学习...
【描述分析】:“自己试试吧挺棒的安卓学生管理开发了很长时间转载的别的地方的”这句话指出该源码已经经过长时间的开发,并且质量良好,可能具有较高的可用性和稳定性。同时,这表明源码并非原创,而是从其他来源...
《深入浅出Android-Google手持设备应用程序设计》是一本专注于Android开发的图书,由gasolin撰写,致力于帮助读者理解和掌握Android手持设备应用的设计与开发。Android,一个由Google主导的开放手机操作系统,已经...
1. **Android开发基础**:这个项目涉及到Android应用程序的基本结构,包括Activity、Intent、BroadcastReceiver等组件的使用,以及AndroidManifest.xml配置文件的编写。 2. **网络请求**:为了获取历史事件的数据,...
【描述】提到,这个应用是基于Android平台构建的,并且所有数据都在本地,这意味着它没有与远程服务器进行交互来获取或更新信息。这种设计可能使用SQLite数据库存储用户评价、商家信息等,或者使用文件系统存储静态...