安卓组件通信与广播消息_第1页
安卓组件通信与广播消息_第2页
安卓组件通信与广播消息_第3页
安卓组件通信与广播消息_第4页
安卓组件通信与广播消息_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

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

文档简介

组件通信与广播消息本章学习内容使用Intent进行组件通信的原理使用Intent启动Activity的方法获取Activity返回值的方法Intent过滤器的原理与匹配机制发送和接收广播消息的方法什么是IntentAndroid中一种消息传递机制,可以通过intent消息激活activity、service和broadcastreceiver。在运行时绑定在同一应用或不同应用的组件。每个intent本身是一个Intent类的对象,是对一个执行动作的抽象描述,包含了组件名(componentname)、动作(action)、数据(data)、类型(category)、附加信息(extra)和标志(flags)信息。应用A应用B某组件某组件发送Intent系统启动发送Intent组件名(componentname)接收intent的组件的名字。是目标组件的完整且有效的类名称(如“ject.FreneticActivity”)。组件名是可选的。如果设置,intent对象就发送给该类的实例;如果没设置,Android会使用intent对象的其它信息去定位一个适合的目标。动作(action)

待执行的由字符串命名的动作。Intent类中定义了许多action常量,包括这些:数据(data)URI(UniformResourceIdentifier)标识抽象和物理资源的字符串。资源标识形式多样:URL,URNURI={URL,URN,……}

URI语法成分<scheme>:<scheme-specific-part>scheme:Justastherearemanydifferentmethodsofaccesstoresources,thereareavarietyofschemesforidentifyingsuchresources.ItdefinesthesemanticsfortheremainderoftheURIstring.Android中的URIEachpartoftheURI:scheme://host:port/pathForexample,

content://ject:200/folder/subfolder/etctheschemeis"content",thehostis"ject",theportis"200",andthepathis"folder/subfolder/etc".ThehostandporttogetherconstitutetheURI

authority;ifahostisnotspecified,theportisignored.Eachoftheseattributesisoptional,buttheyarenotindependentofeachother:Foranauthoritytobemeaningful,aschememustalsobespecified.Forapathtobemeaningful,bothaschemeandanauthoritymustbespecified.

content://ject.healthcareprovider/nurses/rn数据(data)可以明确设设置intent对象中的数数据类型。。setData()方法仅指定定数据的URI,setType()仅指定数据据的MIME类型,setDataAndType()既指其定数数据的URI,又指定MIME类型。URI通过getData()获得,类型型通过getType()获得。类型(category)是一个字符符串,包含含了可以处理intent的这类组件件的其它信信息。在一个intent对象中可以放置任任意多个类类型描述。Intent类定义了很很多类型常常量:addCategory()方法是在intent对象中放入入一个category,removeCategory()将前面添加加的category删除,getCategories()获得当前intent对象中的所所有category。附加信息(extra)由一些键值对组成,是发发送给处理理intent的组件的额额外信息。。Key-valuepairsthatcarryadditionalinformationrequiredtoaccomplishtherequestedaction.一些actions与特殊的extras相配。例如,ACTION_TIMEZONE_CHANGEDintent

有一一个“time-zone“extra,它标标识新的时时间区,ACTION_HEADSET_PLUGintent有一个个”state“extra表示耳耳机是否现现在处于插插入状态。。putExtra(),twoparameters:thekeynameandthevalue.YoucanalsocreateaBundleobjectwithalltheextradata,theninserttheBundleintheIntentwithputExtras().Intent类定义义了很多EXTRA_*,见见文档标志(flags))各种各样类类型的标志志。许多标标志指导Android系统怎样启启动一个activity(如activity属于哪个任任务),activity启动后怎样样对待它((如,是否否它应被放放入最近activities列表)。所所有这些标标志在Intent类中定义。。Intent的用途途启动Activity和Service在Android系系统上发布布广播消息息—可以是接收收到的特定定数据或消消息,也可可以是手机机的信号变变化或电池池的电量低低等信息给每种组件件发送intent都有不同同的机制启动Activity在Android系系统中,应应用程序一一般都有多多个Activity,Intent可以实现不同Activity之之间的切换换和数据传传递启动Activity方式显式启动:必须在Intent中指明明启动的Activity隐式启动:Intent无需指指明具体启启动哪一个个Activity,Android系统根根据Intent的的action、data和category来决定启动动哪一个Activity。。选择权由由Android系系统和最终终用户来决决定。获得返回值值的启动启动Activity显式启动创建一个Intent(见API中android.content.Intent)指定当前的应用用程序上下下文以及要启动的Activity把创建好的的这个Intent作为参数数传递给startActivity()方法Intentintent=newIntent(MainActivity.this,NewActivity.class);startActivity(intent);显式启动下面用IntentDemo为例说明明如何使用用Intent启动动新的Activity。程序默认启启动的Activity是MainActivity,,在用户点点击“启动动Activity”按钮后后,程序启启动NewActivity实现步骤:(1)在AndroidManifest.xml文件件中注册这这两个Activity;—使用<activity>标签,嵌嵌套在<application>标标签内部。。(2)创建建两个Activity的布布局文件;;(3)编写写MainActivity.java和NewActivity.java文件件。隐式启动不需要指明明需要启动动哪一个Activity,而由Android系统来来决定。Android系统统会在程序序运行时解解析Intent,,并根据一一定的规则则对Intent中中的action、data和category与Activity的intent过滤器器中的匹配。。启动Activity匹配的组件件可以是程序本身的Activity,也可以以是Android系统内置应应用的Activity,还可以以是第三方应用用程序提供供的Activity。。这种方式强强调了Android组件的的可复用性性。如果果程程序序开开发发人人员员希希望望启启动动一一个个浏浏览览器器,,查查看看指指定定的的网网页页内内容容,,却却不不能能确确定定具具体体应应该该启启动动哪哪一一个个Activity??程序序开开发发人人员员可可以以将将浏览览动动作作和Web地地址址作为为参参数数传传递递给给Intent,,Android系系统统则则通通过过匹匹配配动动作作和和数数据据格格式式,,找找到到最最适适合合于于此此动动作作和和数数据据格格式式的的组组件件。。隐式式启启动动WebViewIntentDemo示示例例说说明明了了如如何何隐隐式式启启动动Activity,,用用户户界界面面获取取Activity返返回回值值的的启启动动方方式式很多多情情况况下下,,后后启启动动的的Activity是为为了了让让用用户户对对特特定定信信息息进进行行选选择择,,在后后启启动动的的Activity关闭闭时时,这这些些信信息息是是需要要返返回回给给先先前前启启动动的的Activity。后启启动动的的Activity称为为““子子Activity””,先先启启动动的的Activity称为为““父父Activity””。如果果需需要要将将子子Activity的的信信息息返返回回给给父父Activity,则则可可以以使用用获获取取Activity返返回回值值的的方方式式启启动动子子Activity。一般般可可以以分分为为以以下下三三个个步步骤骤::在父父Activity中中启启动动子子Activity在子子Activity中中设设置置返返回回值值在父父Activity中中获获取取返返回回值值在父父Activity中中启启动动子子ActivitystartActivityForResult(Intent,requestCode)::参数数Intent::决定定启启动动哪哪个个Activity;;参数数requestCode:请请求求码码;———所有有子子Activity返返回回时时,Android系统统都都调调用用父父Activity的同同一一个个处处理理方方法法,,因因此此父父Activity使用用requestCode来来确定数据据是哪一一个子Activity返回的显式启动子Activity的代代码如下下隐式启动子Activity的代代码如下下intSUBACTIVITY1=1;Intentintent=newIntent(MainActivity.this,SubActivity1.class);startActivityForResult(intent,SUBACTIVITY1);intSUBACTIVITY2=2;Uriuri=Uri.parse("content://contacts/people");Intentintent=newIntent(Intent.ACTION_PICK,uri);startActivityForResult(intent,SUBACTIVITY2);在子Activity调用finish()关闭前前,调用setResult()设定需要要返回给给父Activity的数据据。setResult(intresultCode,Intentdata):resultCode:表示子子Activity的的返回状状态,通通常为Activity.RESULT_OK((正常返返回数据据)或者者Activity.RESULT_CANCELED(取消消返回数数据),,也可以以是自定定义的;;data:封装返返回数据据的一个个Intent对象。。返回数数据主要要以Uri形式式返回给给父Activity,此外外还可以以附加一一些附加加信息,,这些附附加信息息用Extra的键值值对表示示。在子Activity中设置置返回值值以下代码码说明如如何在子子Activity中中设置返返回值:Uridata=Uri.parse("tel:"+tel_number);Intentresult=newIntent(null,data);result.putExtra("address","JDStreet");setResult(RESULT_OK,result);finish();在父Activity中获取取返回值值当子Activity执行finish()后,,父Activity的onActivityResult()方法会被被调用,,用于获获取子Activity的返返回值。。如果需要要在父Activity中处处理子Activity的返返回值,,则重写此方法。。onActivityResult()方法如下下:requestCode:请请求码,,用来判判断结果果是哪一一个子Activity返回回的;resultCode:表示示子Activity的返回回状态;;data:子Activity用Intent返返回的数数据。根根据返回回数据的的用途不不同,Uri数数据的协协议也不不同,也也可以使使用Extra方法直直接返回回数据本本身。publicvoidonActivityResult(intrequestCode,intresultCode,Intentdata);示例说明明ActivityCommunicationDemo说明了了如何以以获取Activity返回回值方式式启动子子Activity,,以及如如何使用用Intent进行组组件间通通信。当用户点点击“启启动Activity1”和和“启动动Activity2”按钮钮时,程程序将分分别启动动子Activity1和Activity2。。思路?创建每一一个Activity的布局局文件编写每一一个Activity的java代代码MainActivity.java:1、为两两个按钮钮设置事事件监听听器:第一个按按钮:以以获得返返回值方方式启动动Activity1;第二个按按钮:以以获得返返回值方方式启动动Activity2;2、重写写onActivityResult():收到Activity1的返返回结果果时,显显示“Activity1””,并将将Activity1返回的的输入数数据也进进行显示示,若无无则什么么也不显显示;收到Activity2的返返回结果果时,只只显示““Activity2”。。Activity1.java:为为“接受受”和““撤销””按钮设设置事件件监听器器。“接受””:将编编辑文本本框输入入的内容容作为结结果返回回给MainActivity,返返回状态态“OK”;“撤销””:返回回“RESULT_CANCLED”状态态给MainActivity。Activity2.java:为为”关闭闭“按钮钮设置事事件监听听器。”关闭““:返回回“RESULT_CANCLED”状态态给MainActivity。?Intent过滤器((IntentFilter)它是Activity,service和broadcastreceiver用来告知知系统它它们可以以处理什什么样的的隐式intent的一个类类。每个过滤滤器描述述这个组组件能力力的同时时,描述述了该组组件愿意接收收的intents。每个组件件都可以以有一个或多多个intent过滤器。如何给组组件定义义Intent过滤器通常在AndroidManifest.xml文件的各各个组件件下定义义<intent-filter>元素,然然后在<intent-filter>元素中用用<action>、<category>和<data>元素声明明该组件件所支持持的action、data和category信息。也可以在在程序代代码中动动态地为为组件设设置Intent过滤器。。元素属性说明<action>android:name指定组件所能响应的动作,用字符串表示,通常由Java类名和包的完全限定名构成<category>android:name描述组件的其它特征如(Launcher,Home等)<data>android:scheme所需要的特定协议android:host指定一个有效的主机名android:port主机的有效端口号android:path有效的URI路径名android:mimetype指定组件能处理的数据类型(多媒体数据类型)定义<data>Intent与与Intent过滤器的的匹配策策略Android将intent中的action,data和category与所有该该类组件件的intent过滤器中的比较较。只要要有一处处不同,,这个intent就不会被被发送给给那个组组件。一个组件件可以有有多个intent过滤器,,没有匹匹配其中中一个,,却可能能匹配另另一个。。Intent与与Intent过滤器器的匹配配策略actiontest情况1:intent对象仅指指定单一一的action,intent过过滤器列列出一个个以上的的<action>时,,只要有有一个匹匹配上,,就通过过action部分匹匹配;情况2:intent过滤滤器不包包含<action>,任何intent都不会匹匹配上;;情况3:如果intent对象没指指定action,intent过滤滤器包含含至少一一个<action>,则匹配配通过。。Intent与与Intent过滤器器的匹配配策略categorytest情况1::intent对对象可有有多个category,每每一个category必须须匹配intent过过滤器中中的一个个category(过滤器器可以列列出多个个category)),就通通过category部分匹匹配。情况2::若intent对象未未指定category,系系统会默默认为它它设置一一个category:““ent.category.DEFAULT”(CATEGORY_DEFAULT常量量)。所所以,愿愿意接收收隐式intent的的activities必须在intent过过滤器中中包含““ent.category.DEFAULT”。。Intent与与Intent过滤器器的匹配配策略datatest—仅仅比较在在intent过滤器器中提到的URI部部分和数据类型型。—Intent过过滤器中中path部分分可以使使用通配配符,即即pathPattern。Intent与与Intent过滤器器的匹配配策略datatest规规则:无URI,无数据类类型的intent,仅当当intent过滤器器也未指指定任何何URI和数据据类型时时。通过过data部分分匹配测测试。有URI,无数据类类型的intent(且数据据类型不不能从URI提提取),,仅当其其URI与intent过滤滤器中的的URI匹配时时(过滤滤器没指指定数据据类型)),通过过data部分分匹配测测试。如如:不引引用实际际数据的的mailto:和tel:。有数据类类型,无URI的intent,仅当当intent过滤器器也列出出相同数数据类型型且没指指定URI时,,通过data部分匹匹配测试试。既有URI又有有数据类类型(或数据据类型可可以从URI中中提取))的intent,仅仅当它的的数据类类型匹配配过滤器器列出的的类型之之一时,,通过数数据类型型部分的的匹配检检测。如果intent的URI匹匹配过滤滤器中的的一个URI或intent有一一个content:或file:URI而过过滤器没有有指定URI时,该该intent通过过URI部部分匹配测测试。换句话说,,组件默认支支持content:和file:的的数据,尽尽管其intent过滤器中中仅列出了了数据类型型。IntentResolutionDemo示示例当应用程序序安装到Android系统时,AndroidManifest.xml文件中所有有的组件和和Intent过滤器都会会注册到Android系统中。这样,Android系统便可以以将任何一一个Intent请求通过Intent过滤器映射射到相应的的组件上。。Intent与广播消息息Intent的另一用途途是发送广播消消息,应用程序序和Android系统都可以以使用Intent发送广播消消息。广播消息的的内容:与应用程程序密切相相关的数据据信息,Android的系统信息息,如网络络连接变化化、电池电电量低、接接收到短信信或系统设设置变化等等。应用程序中中注册了BroadcastReceiver,则可以接接收到指定定的广播消消息。注册BroadcastReceiverYoucaneitherdynamicallyregisteraninstanceofthisclasswithregisterReceiver()orstaticallypublishanimplementationthroughthe<receiver>taginyourAndroidManifest.xml.Note:IfregisteringareceiverinyourActivity.onResume()implementation,youshouldunregisteritinActivity.onPause().(Youwon'treceiveintentswhenpaused,andthiswillcutdownonunnecessarysystemoverhead).DonotunregisterinActivity.onSaveInstanceState(),becausethi

温馨提示

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

评论

0/150

提交评论