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

下载本文档

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

文档简介

组件通信与广播消息本章学习内容使用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和其MIME类型。

不同的action对应不同类型的数据规格说明(specifications)。

ACTION_EDIT,data就是要编辑、显示的文档的URI;

ACTION_CALL,data就是一个带有呼叫号码的tel:URI。

ACTION_VIEW,data就是一个http:URI,接收的activity将被调用去下载显示URI引用的资源。MIME类型也很重要。例如,一个能显示图片数据的组件不应该被调用去播放音频文件。URI(UniformResourceIdentifier)标识抽象和物理资源的字符串。资源标识形式多样:URL,URNURI={URL,URN,……}

URI语法成分

<scheme>:<scheme-specific-part>scheme:Justastherearemanydifferentmethodsofaccesstoresources,thereareavarietyofschemesforidentifyingsuchresources.ItdefinesthesemanticsfortheremainderoftheURIstring.ftp://ftp.is.co.za/rfc/rfc1808.txt/rfc/rfc2396.txtmailto:John@telndroid中的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)被操作数据的URI和其MIME类型。

不同的action对应不同类型的数据说明(specifications)。

ACTION_EDIT,data就是要编辑、显示的文档的URI(file:);

ACTION_CALL,data就是一个带有呼叫号码的tel:URI。

ACTION_VIEW,data就是一个http:URI,接收的activity将被调用去下载显示URI引用的资源。MIME类型也很重要。例如,一个能显示图片数据的组件不应该被调用去播放音频文件。可以明确设置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_CHANGED

intent

有一个“time-zone“extra,它标识新的时间区,ACTION_HEADSET_PLUGintent有一个”state“extra表示耳机是否现在处于插入状态。putExtra()

,twoparameters:thekeynameandthevalue.Youcanalsocreatea

Bundle

objectwithalltheextradata,theninsertthe

Bundle

intheIntent

with

putExtras().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系统则通过匹配动作和数据格式,找到最适合于此动作和数据格式的组件。

Intentintent=newIntent(Intent.ACTION_VIEW,Uri.parse(".hk"));startActivity(intent);隐式启动Android系统在匹配Intent时,首先根据动作Intent.ACTION_VIEW,得知需要启动具备浏览功能的Activity,但具体是浏览电话号码还是浏览网页,还需要根据数据的URI来做最后判断。因为数据提供的是Web地址“http://”,所以最终可以判定Intent需要启动具有网页浏览功能的Activity。一般情况下,Android系统会调用内置的Web浏览器。隐式启动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(int

resultCode,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(int

requestCode,int

resultCode,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-filter...>

<dataandroid:mimeType="video/mpeg"android:scheme="http".../>

<dataandroid:mimeType="audio/mpeg"android:scheme="http".../>

...

</intent-filter>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,则可以接收到指定的广播消息。注册BroadcastReceiverYoucaneitherdynamicallyregisteraninstanceofthisclasswith

registerReceiver()

orstaticallypublishanimplementationthroughthe<receiver>

taginyour

AndroidManifest.xml.Note:

Ifregisteringareceiverinyour

Activity.onResume()

implementation,yousho

温馨提示

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

评论

0/150

提交评论