《Android移动应用开发》Intent与应用间的通信_第1页
《Android移动应用开发》Intent与应用间的通信_第2页
《Android移动应用开发》Intent与应用间的通信_第3页
《Android移动应用开发》Intent与应用间的通信_第4页
《Android移动应用开发》Intent与应用间的通信_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

Intent2023/9/28082023/9/28认识Intent构建Intent目录CONTENT12解析Intent3参考教材:《Android应用开发项目化教程》认识Intent作用Intent是一个消息传递对象,可以使用它协助应用之间的交互与通讯。Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。1认识Intent启动组件ActivitystartActivity()

startActivityForResult()ServicestartService()

bindService()BroadcastReceiversendBroadcast()sendOrderedBroadcast()sendStickyBroadcast()1认识Intent两种Intent显式Intent按名称(完全限定类名)指定要启动的组件。通常用于自己的应用中。IntentdownloadIntent=newIntent(this,DownloadService.class);downloadIntent.setData(Uri.parse(fileUrl));startService(downloadIntent);1认识Intent两种Intent隐式Intent不会指定特定的组件,而是声明要执行的常规操作,从而允许其他应用中的组件来处理它。Uriuri=Uri.parse("");Intentit=newIntent(Intent.ACTION_VIEW,uri);startActivity(it);1Intent在通信过程中需要检查相应的权限,如果AndroidManifext.xml中没有相应的权限说明,则无法激活组件。认识Intent两种Intent验证Activity用户可能没有任何应用处理发送到startActivity()的隐式Intent。如果出现这种情况,则调用将会失败,且应用会崩溃。要验证Activity是否会接收Intent,需要对Intent对象调用resolveActivity()。如果结果为非空,则至少有一个应用能够处理该Intent,且可以安全调用startActivity()。如果结果为空,则不应使用该Intent。如有可能,您应禁用发出该Intent的功能。1认识Intent两种Intent使用应用选择器如果有多个应用响应隐式Intent,且用户可能希望每次使用不同的应用,则应采用显式方式显示选择器对话框。1认识Intent两种Intent特别说明为了确保应用的安全性,启动Service时,请始终使用显式Intent,且不要为服务声明Intent过滤器。使用隐式Intent启动服务存在安全隐患,因为您无法确定哪些服务将响应Intent,且用户无法看到哪些服务已启动。从Android5.0(API级别21)开始,如果使用隐式Intent调用bindService(),系统会抛出异常。1构建Intent组件名称ComponentNameIntent对象通过组件来显式设置Intent的访问对象。指定的方法 setComponent(ComponentName)setClass(Context,Class)setClassName()通过getComponent()读取组件。ComponentName对象是目标组件的完全限定类名(如"com.android.mms.ui.ConversationList")和应用程序所在的包在清单文件中的名字(如"com.android.mms")的组合。其中组件名字中的包部分不必一定和清单文件中的包名一样。2构建Intent操作ActionAction是一个字符串,是对Intent执行动作的描述Action可以是系统预定义的,如:ACTION_CALLACTION_EDITACTION_MAINAction也可以是自己定义的字符串。自定义动作字符串应该包含应用程序包名前缀。通过setAction()方法设置,通过getAction()方法读取。Action很大程度上决定了剩下的Intent如何构建,特别是数据和附加字段。因此,应该尽可能明确指定动作,并紧密关联到其他Intent字段。2构建Intent数据DataData是作用于Intent上的数据的Uri和数据的MIME类型。在Android中,传给Intent的数据用Uri格式表示,因此需要使用Uri.parse()方法将字符串格式化。不同的动作有不同的数据规格。例如:ACTION_EDIT使用编辑文档的UriACTION_CALL使用tel:URI和将拨打的号码ACTION_VIEW使用http:Uri主要方法:setData()方法指定数据的UrisetType()指定MIME类型setDataAndType()指定数据的Uri和MIME类型(提倡使用本方法)getData()读取UrigetType()读取类型。2构建Intent类别CategoryCategory是一个字符串,描述了应该处理Intent的组件类型信息。可以在一个Intent对象中指定任意数量的类别描述。Intent类定义了许多Category常数。在AndroidManifest.xml中,ent.action.MAIN和ent

.category.LAUNCHER分别标记Activity开始新的任务和转到启动列表界面。向Intent对象添加一个类别使用addCategory()方法,删除一个之前添加的类别使用removeCategory()方法,获取Intent对象中的所有类别使用getCategories()方法。2构建Intent附加信息Extra携带完成请求操作所需的附加信息的键值对。可以使用各种putExtra()方法添加附加数据,每种方法均接受两个参数:键名和值。可以创建一个包含所有附加数据的Bundle对象,然后使用putExtras()将Bundle插入Intent中。Intentit=newIntent(Activity.this,Activity2.class);Bundlebundle=newBundle();bundle.putString(“msg","ThisisfromMainActivity!");it.putExtras(bundle);startActivity(it);2构建Intent标志Flags在Intent类中定义的、充当Intent元数据的标志。标志可以指示Android系统如何启动Activity(例如,Activity应属于哪个任务),以及启动之后如何处理(例如,它是否属于最近的Activity列表)。Intentintent=newIntent(this,xxx.class);intent.addFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);2解析Intent隐式Intent的执行流程创建隐式Intent时,Android系统通过将Intent的内容与在设备上其他应用的清单文件中声明的Intent过滤器进行比较,从而找到要启动的相应组件。如果与Intent过滤器匹配,则系统将启动该组件,并将其传递给对象。如果多个Intent过滤器兼容,则系统会显示一个对话框,支持用户选取要使用的应用。3解析IntentIntent过滤器每个Intent过滤器均根据Intent的操作、数据和类别指定自身接受的Intent类型。定义Intent过滤器在AndroidManifest中,使用<intent-filter>元素为每个应用组件声明一个或多个Intent过滤器仅当隐式Intent可以通过Intent过滤器之一传递时,系统才会将该Intent传递给应用组件。3注意:显式Intent始终会传递给其目标,无论组件声明的Intent过滤器如何均是如此。解析IntentIntent过滤器包含元素action在name属性中,声明接受的Intent操作。该值必须是操作的文本字符串值,而不是类常量。data使用一个或多个指定数据URI(scheme、host、port、path等)各个方面和MIME类型的属性,声明接受的数据类型。category在name属性中,声明接受的Intent类别。该值必须是操作的文本字符串值,而不是类常量。3解析IntentIntent过滤器示例

3解析IntentIntent过滤器特别说明为了接收隐式Intent,必须将CATEGORY_DEFAULT类别包括在Intent过滤器中。方法startActivity()和startActivityForResult()将按照已申明CATEGORY_DEFAULT类别的方式处理所有Intent。如果未在Intent过滤器中声明此类别,则隐式Intent不会解析为您的Activity。可以创建一个包括多个action、data或category实例的过滤器。创建时,仅需确定组件能够处理这些过滤器元素的任何及所有组合即可。使用Intent过滤器时,无法安全地防止其他应用启动组件。尽管Intent过滤器将组件限制为仅响应特定类型的隐式Intent,但如果开发者确定您的组件名称,则其他应用有可能通过使用显式Intent启动您的应用组件。如果必须确保只有您自己的应用才能启动您的某一组件,需要将该组件exported属性设置为"false"。3解析IntentAction过滤规则Intent对象中指定的动作必须匹配Intent过滤器动作列表中的一个。如果Intent或Intent过滤器没有指定一个动作,则:如果Intent过滤器没有指定动作,没有一个Intent被匹配,所有的Intent都检测失败,即没有Intent能够通过Intent过滤器;如果Intent对象没有指定动作(但必须指定其他属性),将自动通过检查(前提是Intent过滤器的动作列表不为空)。3解析IntentCategory过滤规则Intent对象中的每个类别必须匹配Intent过滤器中的一个。即Intent过滤器能够列出额外的类别,但是Intent对象中的类别都必须能够在Intent过滤器中找到,只要有一个类别在Intent过滤器列表中没有,就算类别检测失败。因此,原则上如果一个Intent对象中没有类别(即类别字段为空),那么应该总是通过类别测试,而不管Intent过滤器中有什么类别。但是有个例外,Android对待所有传递给Context.startActivity()的隐式Intent至少包含“ent.category.DEFAULT”类别。3解析IntentData过滤规则一个Intent对象既不包含Uri,也不包含数据类型:仅当Intent过滤器也不指定任何Uri和数据类型时,才能通过检测,否则不能通过。一个Intent对象包含Uri,但不包含数据类型:仅当Intent过滤器也不

温馨提示

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

评论

0/150

提交评论