AndroidIntent详解_第1页
AndroidIntent详解_第2页
AndroidIntent详解_第3页
AndroidIntent详解_第4页
AndroidIntent详解_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 Intent 详解一、 Intent 作用 Intent 是一个将要执行的动作的抽象的描述,一般来说是作为参数来使用,由Intent来协助完成android各个组件之间的通讯。比如说调用startActivity()来启动一个activity,或者由broadcaseIntent()来传递给所有感兴趣的BroadcaseReceiver, 再或者由startService()/bindservice()来启动一个后台的service.所以可以看出来,intent主要是用来启动其他的activity 或者service,所以可以将intent理解成activity之间的粘合剂。 二、 Inte

2、nt的构成 要在不同的activity之间传递数据,就要在intent中包含相应的东西,一般来说数据中最基本的应该包括: Action 用来指明要实施的动作是什么,比如说ACTION_VIEW, ACTION_EDIT等。具体的可以查阅android SDK- reference中的Aent类,里面的constants中定义了所有的action。 Data 要事实的具体的数据,一般由一个Uri变量来表示 下面是一些简单的例子: ACTION_VIEWcontent:/contacts/1/显示identifier为1的联系人的信息。 ACTION_DIAL

3、content:/contacts/1/给这个联系人打电话 除了Action和data这两个最基本的元素外,intent还包括一些其他的元素, Category(类别): 这个选项指定了将要执行的这个action的其他一些额外的信息,例如 LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶级应用出现;而ALTERNATIVE_CATEGORY表示当前的Intent是一系列的可选动作中的一个,这些动作可以在同一块数据上执行。具体同样可以参考android SDK- reference中的Aent类。以前我也写过一篇于c

4、ategory有关的文章,点击这里可以查看。 Type(数据类型): 显式指定Intent的数据类型(MIME)。一般Intent的数据类型能够根据数据本身进行判定,但是通过设置这个属性,可以强制采用显式指定的类型而不再进行推导。 component(组件): 指定Intent的的目标组件的 类名称。通常 Android会根据Intent 中包含的其它属性的信息,比如action、data/type、category进行查找,最终找到一个与之匹配的目标组件。但是,如果 component这个属性有指定的话,将直接使用它指定的组件,而不再执行上述查找过程。指定了这个属性以后,Intent的其它所

5、有属性都是可选的。 extras(附加信息),是其它所有附加信息的集合。使用extras可以为组件提供扩展信息,比如,如果要执行“发送电子邮件”这个动作,可以将电子邮件的标题、正文等保存在extras里,传给电子邮件发送组件。 下面是这些额外属性的几个例子: ACTION_MAIN with category CATEGORY_HOME /用来 Launch home screen. 以前我也写过一篇于与之有关的文章, 点击这里可以看到。 ACTION_GET_CONTENT with MIME type vnd.android.cursor.item/phone /用来列出列表中的所有人的电

6、话号码 综上可以看出,action、 data/type、category和extras 一起形成了一种语言,这种语言可以是android可以表达出诸如“给张三打电话”之类的短语组合。 三、 intent的解析 应用程序的组件为了告诉Android自己能响应、处理哪些隐式Intent请求,可以声明一个甚至多个Intent Filter。每个Intent Filter描述该组件所能响应Intent请求的能力组件希望接收什么类型的请求行为,什么类型的请求数据。比如之前请求网页浏览器这个例子中,网页浏览器程序的Intent Filter就应该声明它所希望接收的Intent Action是WEB_SE

7、ARCH_ACTION,以及与之相关的请求数据是网页地址URI格式。如何为组件声明自己的Intent Filter? 常见的方法是在AndroidManifest.xml文件中用属性描述组件的Intent Filter。前面我们提到,隐式Intent(Explicit Intents)和Intent Filter(Implicit Intents)进行比较时的三要素是Intent的动作、数据以及类别。实际上,一个隐式Intent请求要能够传递给目标组件,必要通过这三个方面的检查。如果任何一方面不匹配,Android都不会将该隐式Intent传递给目标组件。接下来我们讲解这三方面检查的具体规则。

8、1.动作测试Java代码元素中可以包括子元素,比如: 一条元素至少应该包含一个,否则任何Intent请求都不能和该匹配。如果Intent请求的Action和中个某一条匹配,那么该Intent就通过了这条的动作测试。如果Intent请求或中没有说明具体的Action类型,那么会出现下面两种情况。(1) 如果中没有包含任何Action类型,那么无论什么Intent请求都无法和这条匹配; (2) 反之,如果Intent请求中没有设定Action类型,那么只要中包含有Action类型,这个 Intent请求就将顺利地通过的行为测试。 2.类别测试Java代码元素可以包含子元素,比如: 只有当Inten

9、t请求中所有的Category与组件中某一个IntentFilter的完全匹配时,才会让该 Intent请求通过测试,IntentFilter中多余的声明并不会导致匹配失败。一个没有指定任何类别测试的 IntentFilter仅仅只会匹配没有设置类别的Intent请求。 3.数据测试数据在中的描述如下:Java代码 元素指定了希望接受的Intent请求的数据URI和数据类型,URI被分成三部分来进行匹配:scheme、 authority和path。其中,用setData()设定的Inteat请求的URI数据类型和scheme必须与IntentFilter中所指定的一致。若IntentFilt

10、er中还指定了authority或path,它们也需要相匹配才会通过测试。4.简单例子说明讲解完Intent基本概念之后,接下来我们就使用Intent激活Android自带的电话拨号程序,通过这个实例你会发现,使用Intent并不像其概念描述得那样难。最终创建Intent的代码如下所示。Intent i = new 创建好Intent之后,你就可以通过它告诉Android希望启动新的Activity了。startActivity(i);Activity启动后显示界面如下:三、Intent的构造函数公共构造函数:1、Intent() 空构造函数2、Intent(Intent o) 拷贝构造函数3

11、、Intent(String action) 指定action类型的构造函数4、Intent(String action, Uri uri) 指定Action类型和Uri的构造函数,URI主要是结合程序之间的数据共享ContentProvider5、Intent(Context packageContext, Class cls) 传入组件的构造函数,也就是上文提到的6、Intent(String action, Uri uri, Context packageContext, Class cls) 前两种结合体Intent有六种构造函数,3、4、5是最常用的,并不是其他没用!Intent(S

12、tring action, Uri uri) 的action就是对应在AndroidMainfest.xml中的action节点的name属性值。在Intent类中定义了很多的Action和Category常量。示例代码二: 1: Intent intent = new Intent(Intent.ACTION_EDIT, null); 2: startActivity(intent);示例代码二是用了第四种构造函数,只是uri参数为null。执行此代码的时候,系统就会在程序主配置文件AndroidMainfest.xml中寻找对应的Activity,如果对应为多个activity具有此时就会

13、弹出一个dailog选择Activity,如下图:如果是用示例代码一那种方式进行发送则不会有这种情况。三、利用Intent在Activity之间传递数据在Main中执行如下代码: 1: Bundle bundle = new Bundle(); 2: bundle.putStringArray(NAMEARR, nameArr); 3: Intent intent = new Intent(Main.this, CountList.class); 4: intent.putExtras(bundle); 5: startActivity(intent);在CountList中,代码如下: 1:

14、 Bundle bundle = this.getIntent().getExtras(); 2: String arrName = bundle.getStringArray(NAMEARR);以上代码就实现了Activity之间的数据传递!Android intent intent-filter5. 总结说明这篇文章是我刚开始学习Android时看到的,当时理解的不是很深入,现在再回头看这篇文章总结的很详细,在这里与大家分享。1,掉web浏览器Java代码Uri myBlogUri = Uri.parse();returnIt = new Intent(Intent.ACTION_VIEW

15、, myBlogUri);2,地图Java代码Uri mapUri = Uri.parse(geo:38.899533,-77.036476);returnIt = new Intent(Intent.ACTION_VIEW, mapUri);3,调拨打电话界面Java代码Uri telUri = Uri.parse(tel:100861);returnIt = new Intent(Intent.ACTION_DIAL, telUri);4,直接拨打电话Java代码Uri callUri = Uri.parse(tel:100861);returnIt = new Intent(Intent

16、.ACTION_CALL, callUri);5,卸载Java代码Uri uninstallUri = Uri.fromParts(package, xxx, null);returnIt = new Intent(Intent.ACTION_DELETE, uninstallUri);6,安装Java代码Uri installUri = Uri.fromParts(package, xxx, null);returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri);7,播放Java代码Uri playUri = Uri.pars

17、e(file:/sdcard/download/everything.mp3);returnIt = new Intent(Intent.ACTION_VIEW, playUri);8,掉用发邮件Java代码Uri emailUri = Uri.parse();returnIt = new Intent(Intent.ACTION_SENDTO, emailUri);9,发邮件Java代码returnIt = new Intent(Intent.ACTION_SEND);String tos = ;String ccs = ;returnIt.putExtra(Intent.EXTRA_EMA

18、IL, tos);returnIt.putExtra(Intent.EXTRA_CC, ccs);returnIt.putExtra(Intent.EXTRA_TEXT, body);returnIt.putExtra(Intent.EXTRA_SUBJECT, subject);returnIt.setType(message/rfc882);Intent.createChooser(returnIt, Choose Email Client);10,发短信Java代码Uri smsUri = Uri.parse(tel:100861);returnIt = new Intent(Inten

19、t.ACTION_VIEW, smsUri);returnIt.putExtra(sms_body, shenrenkui);returnIt.setType(vnd.android-dir/mms-sms);11,直接发邮件Java代码Uri smsToUri = Uri.parse(smsto:/100861);returnIt = new Intent(Intent.ACTION_SENDTO, smsToUri);returnIt.putExtra(sms_body, shenrenkui);12,发彩信Java代码Uri mmsUri = Uri.parse(content:/med

20、ia/external/images/media/23);returnIt = new Intent(Intent.ACTION_SEND);returnIt.putExtra(sms_body, shenrenkui);returnIt.putExtra(Intent.EXTRA_STREAM, mmsUri);returnIt.setType(image/png);用获取到的Intent直接调用startActivity(returnIt)就ok了。实 例下面,以Android SDK中的便笺例子来说明,Intent如何定义及如何被解析。这个应用可以让用户浏览便笺列表、查看每一个便笺的详细

21、信息。Manifest.xmlXml代码1. 3. 5. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 例子中的第一个Activity 是com.google.android.notepad.NotesList,它是应用的主入口,提供了三个功能,分别由三个 intent-filter进行描述: 1、第一个是进入便笺

22、应用的顶级入口(action为android.app.action.MAIN)。类型为android.app.category.LAUNCHER表明这个Activity将在Launcher中列出。 2、第二个是,当type为vnd.android.cursor.dir/vnd.google.note(保存便笺记录的目录) 时,可以查看可用的便笺(action为android.app.action.VIEW),或者让用户选择一个便笺并返回给调用者(action为 android.app.action.PICK)。 3、第三个是,当type为vnd.android.cursor.item/vnd.

23、google.note时,返回给调用者一个用户选择的便笺(action为android.app.action.GET_CONTENT),而用户却不需要知道便笺从哪里读取的。 有了这些功能,下面的Intent就会被解析到NotesList这个activity: * action=android.app.action.MAIN :与此Intent匹配的Activity,将会被当作进入应用的顶级入口。 * action=android.app.action.MAIN, category=android.app.category.LAUNCHER :这是目前Launcher实际使用的 Intent,用

24、于生成Launcher的顶级列表。 * action=android.app.action.VIEW data=content:/vider.NotePad/notes :显示content:/vider.NotePad/notes下的所有便笺的列表,使用者可以遍历列表,并且察看某便笺的详细信息。 * action=android.app.action.PICK data=content:/vider.NotePad/notes :显示content:/vider.NotePad/n

25、otes下的便笺列表,让用户可以在列表中选择一个,然后将选择的便笺的 URL返回给调用者。 * action=android.app.action.GET_CONTENT type=vnd.android.cursor.item/vnd.google.note :和 上面的action为pick的Intent类似,不同的是这个Intent允许调用者(在这里指要调用NotesList的某个Activity)指定 它们需要返回的数据类型,系统会根据这个数据类型查找合适的 Activity(在这里系统会找到NotesList这个Activity),供用户选择便笺。 第二个Activity是com.g

26、oogle.android.notepad.NoteEditor,它为用户显示一条便笺,并且允许 用户修改这个便笺。它定义了两个intent-filter,所以具有两个功能。第一个功能是,当数据类型为 vnd.android.cursor.item/vnd.google.note时,允许用户查看和修改一个便签(action为 android.app.action.VIEW和android.app.action.EDIT)。第二个功能是,当数据类型为 vnd.android.cursor.dir/vnd.google.note,为调用者显示一个新建便笺的界面,并将新建的便笺插 入到便笺列表中(a

27、ction为android.app.action.INSERT)。 有了这两个功能,下面的Intent就会被解析到NoteEditor这个activity: * action=android.app.action.VIEW data=content:/vider.NotePad/notes/ID :向用户显示标识为 ID的便笺。 * action=android.app.action.EDIT data=content:/vider.NotePad/notes/ID :允许用户编辑标识为ID的便笺。 * action=android.app.action.INSERT data=content:/vider.NotePad/notes :在“content:/vider.NotePad/notes”这个便笺列表中创建一个新的空便笺,并允许用 户编辑这个便签。当用户保存这个便笺后,这个新便笺的URI将会返回给调用者。 最后一个Activity是com.google.android.notepad.TitleEditor,它允许用户编辑便笺的标题。它可以被实现为 一个应用可以直接调用(在Intent

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论