第6章组件通信与广播消息解析_第1页
第6章组件通信与广播消息解析_第2页
第6章组件通信与广播消息解析_第3页
第6章组件通信与广播消息解析_第4页
第6章组件通信与广播消息解析_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

1、6.1 Intent 简介第6章组件通信与广播消息本章学习目标 了解使用Intent进行组件通信的原理掌握使用Intent启动Activity的方法掌握获取Activity返回值的方法 了解Intent过滤器的原理与匹配机制掌握发送和接收广播消息的方法 Intent是一个动作的完整描述,包含了动作的 产生组件、接收组件和传递的数据信息 Intent也可称为一个在不同组件之间传递的消息,这个 消息在到达接收组件后,接收组件会执行相关的动作 Intent为Activity、Service和BroadcastReceiver等组件 提供交互能力 Intent的用途 启动 Activity 和 Ser

2、vice在Android系统上发布广播消息广播消息可以是接收到特定数据或消息,也可以是手机 的信号变化或电池的电量过低等信息6.1 Intent 简介 6.1.1 启动 Activity在Android系统中,应用程序一般都有多个Activity, Intent可以实现不同Activity之间的切换和数据传舗启动Activity方式显式启动,必须在Intent中指明启动的Activity所在的类隐式启动,Android系统根据Intent的动作和数据来决定 启动哪一个Activity,也就是说在隐式启动时,I ntent中只 包含需要执行的动作和所包含的数据,而无需指明具体启 动哪一个Acti

3、vity,选择权有Android系统和最终用户来决 定 6.1.1 启动 Activity显式启动使用Intent显式启动Activity 创建一个Intent指定当前的应用程序上下文以及要启动的Activity 把创建好的这个Intent作为参数传递给startActivity()方法1. Intent intent = new Intcnl(IntentDcmo.lhis, AclivilyTbSlarl.class);2. startActivity(intent);6.1 Intent 简介 6.1.1 启动 Activity显式启动 下面用IntentDemo示例说明如何使用Inte

4、nt启动新的 Activity。IntentDemo示例包含两个Activity,分别是 IntentDemoActivity 和 N ew Activity。 程序默认启动的Activity是IntentDemo,在用户点击“启 动Activity1*按钮后,程角启动的Activity是NewActivity吆 1 1:37.IntentDemo IntentDemo启动 ActivityA new Activity has been started. 6.1.1 启动 Activity显式启动在IntentDemo示例中使用了两个Activity,因此需要在 AndroidManifest

5、.xml文件中注册这两个Activity。注册 Activity应使用activitya标签,嵌套在vapplication标签 内部。6.1 Intent 简介 6.1.1 启动 Activity显式启动 AndroidManifest.xml 文件代码如下InlMtDemr104ttMn n11ct9fyirVtort.c4t9Cy IAUNCMCR*121314ac* NmAcM/15乂 UMh俺 w“p.n”(C1617/4*plC4tion18uavi-iA MfoKmnS19 6.1.1 启动 Activity显式启动 Android应用程序中,用户使用的每个组件都必须在 Andr

6、oidManifest.xml 文件中的 v application 节点内定义。 在上面的代码中,vapplicatioriA节点下共有两个 节点,分别代表应用程序中所使用的两个 Activity, IntentDemoActivity和NewActivity。6.1 Intent 简介 6.1.1 启动 Activity显式启动 在IntentDemoActivity.java文件中,包含了使用Intent启动 Activity的核心代码:1 Button button = (Button)findViewByld(R.id.btni;2. button. setOnC li ck Li

7、stener(new OnClickListener()3. public void onClick(View view)4. Intent intent = new lntent(lntentDemoActivity.this, NewActivity.class);5. startActivity(intent);6 7. ); 6.1.1 启动 Activity显式启动在点击事件的处理函数中,Intent构造函数的第1个参数是 应用程彥上下文,在这里就是IntentDemoActivity;第2个 参数是接收Intent的目标组件,这里使用的是显式启动方 式,直接指明了需要启动的Acti

8、vity o6.1 Intent 简介 6.1.1 启动 Activity隐式启动隐式启动的好处在于不需要指明需要启动哪一个Activity ,而由Android系统来决定,这样有利于降低组件之间的 耦合度。选择隐式启动Activity, Android系统会在程序运行时解析 Intent,并根据一定的规则对Intent和Activity进行匹配, 使Intent_h的动作、数据与Activity完全吻合。匹配的组件可以是程序本身的Activity,也可以是Android 系统内置的Activity,还可以是第三方应用程序提供的 Activity o因此,这种方式强调了Android组件的可复

9、用性。 6.1.1 启动 Activity隐式启动如果程序开发人员希望启动一个浏览器,查看指定的网页内容 ,却不能确定具体应该启动哪一个Activity,此时则可以使用 Intent的隐式启动方式,由Android系统在程序运行时决定具体 启动哪一个应用程序的Activity A-R收这个Intent。 程序开发人员可以将浏览动作和Web地址作为参数传递给Intent ,Android系统则通过匹配动作和数据格式,找到最适合于此动 作和数据格式的组件。Intent = new I(xent(lrx&nt ACTlOLVIEW, Un pa$e(*http google com hkJX *ta

10、rt/UnvICK心动个rActivity从捉供的救粼外农中盘敞项ACTIOX.SIARCH“幼Activity执行搜水动件ACTIOX.SDTOTOM) Activity向:供的联瑕人发迖伯息ACTIOM.SEMD门动个町以发的ACbdtyACTIOM.VIEV”能川的妙作.対以Uri方式传送的数赂 WFrl协谏莎分WAifl力比議动相应的ActivKy进行处丹 对 fhttp:Address*fH;l i?Jtiftfri 对 i tel :aMrcssttH;!WillioHfiit的血话号科ACTIOX.IEB.SEARCH打开 个Activity对捉供的数WilLb-leb捜血 6.

11、1.1 启动 Activity隐式启动 WebViewIntentDemo示例说明了如何隐式启动Activity, 用户界面% a i:55 WebViewIntentDemo http:/www.qooqlecom.hk 浏览此URL6.1 Intent 简介6.1.1 启动 Activity隐式启动 1:56所科須貝 BB片 他方資也 新M更去Google当用户在文本框中输入 Web地址后,通过点击“ 浏览此URL”按钮,程序根 据用户输入的Web地址生 成一个Intent,并以隐式启 动的方式调用Android内置 的Web浏览器,并打开指 定的Web页面。本例输入 的Web地址.hk

12、,打开页面后的效果如图 6.1.2获取Activity返回值在上一小节IntentDemo示例中,通过 startActivity(lntent)方法启动Activity,启动后的两 个Activity之间相互独立,没有任何的关联。在很多 情况下,后启动的Activity是为了让用户对特定信息 进行选择,在后启动的Activity关闭时,这些信息是 需要返回给先前启动的Activity。后启动的Activity称为为子Activity,先启动的 Activity称为“父Activity。口如果需要将子Activity的信息返回给父Activity,则可 以使用Sub-Activity的方式去启

13、动子Activity6.1 Intent 简介6.1.2获取Activity返回值 获取子Activity的返回值,一般可以分为以下三个 步骤: 以 Sub-Activity 的方式启动子 Activity;设置子Activity的返回值; 在父Activity中获取返回值; 下面详细介绍每一个步骤的过程和代码实现。 6.1.2获取Activity返回值以Sub-Activity的方式启动子Activity以Sub-Activity方式启动子Activity,需要调用 startActivityForResult(lntent, requestcode)函数,参数 Inlenl用于决定启动哪个

14、Activity,参数requeslCode是请 求码。因为所有子Activity返回时,父Activity都调用相同 的处理函数,因此父Activity使用requestcode来确定数据 是哪一个子Activity返回的6.1 Intent 简介 6.1.2获取Activity返回值以Sub-Activity的方式启动子Activity显式启动子Activity的代码如下4 intSUBACTIVIT = 1;2. Intent intent = new lntent(this. SubActivityl .class);3. startActivityForResult(intentf

15、SUBACTIVITY1)隐式启动子Activity的代码如下1. int SUBACTIVITY2 = 2;2. Uri uri = Uri.parse(content:/contacts/people);3. Intent intent = new lntent(lntent.ACTION_PICK. uri);4. startActivityForResult(intent. SUBACTIVITY2); 6.1.2获取Activity返回值设置子Activity的返回值在子Activity调用finish()函数关闭前,调用setResult()函数 设定需要返回给父Activity的

16、数据。setResult()函数看两个 参数,一个是结采码,一个是返回值。结果码表明了子 Activity的返回状态,通常为Activity.RESULT_OK (正常 返回数据)或者Activity.RESULT_CANCELED (取消返 回数据),也可以是自定义的结東码,结果码均为整数类 型。返回值封装在Intent中,也就是说子Activity通过 Intent将需要返回的数据传递给父Activity.数据主要以Uri 形式返回给父Activity,此外还可以附加一些额外信息, 这些额外信息用Extra的集合表示。6.1 Intent 简介 6.1.2获取Activity返回值设置子A

17、ctivity的返回值 以下代码说明如何在子Activity中设葢返回值:1. Uri data = Uri.parse(”tel: + tel_number);2. Intent result = new lntent(null, data);3. result.putExtra(waddressw, *JD Street*);4. setResult(RESULT OK, result);5. finish();6.1.2获取Activity返回值在父Activity中获取返回值当子Activity关闭后,父Activity会调用 onActivityResult()函数, 用了获取子Ac

18、tivity的返回值。 如果需要在父Activity中处理子Activity的返回值,则重载此函数 即可。 onActivityResult()函数的语法如下:public void onActivityResult(int requestcode, int resultCode. Intent data);其中第1个参数requestcode是请求码,用来判断第3个参数是 哪一个子Activity将返回值;resultCode用于表示子Activity的数 据返回状态;Data是子Activity的返回数据,返回数据类型是 Intents根据返回数据的用途不同,Uri数据的协议则不同,也 可

19、以使用Extra方法返回一些原始类型的数据。6.1 Intent 简介6.1.2获取Activity返回值在父Activity中获取返回值 以下代码说明如何在父Activity中处理子Activity的返回值:private static final int SUBACTIVITY1 = 1;01.2345 & 789234567891111111111private static final int SUBACTIVITY2 = 2;Overridepublic void onActivityResult(int requestcode. int resultCode, Intent dat

20、a) Super.onActivityResult(requestCode, resultCode, data); switch(requestCode)case SUBACTIVITY1:if (resultcode = Activity.RESULT_OK)Uri uriData = data.getData();else if (resultCode = Activity.RESULT CANCEL) break;case SUBACTIVITY2:if (resultCode = Activity. RESULT_OK)Uri uriData = data.getData();brea

21、k; 6.1.2获取Activity返回值在父Activity中获取返回值代码的第1行和第2行是两个子Activity的请求码,在第7行 对请求码进行匹配。 代码第9行和第11行对结果码进行判断,如果返回的结果 码是Activity.RESULT_OK,则在代码的第10行使用 getData ()函数获取Intent中的Uri数据;如果返回的结果码是Activity.RESULT_CANCELED,贝U 放弃所有操作。6.1 Intent 简介 6.1.2获取Activity返回值在父Activity中获取返回值 Activitycommunication示例说明 了 如何以Sub-Activ

22、ity方 式启动子Activity,以及如何使用Intent进行组件间通信。 2:04萨 Activitycommunication启动 Activityl启动 Activity2 6.1.2获取Activity返回值在父Activity中获取返回值当用户点击“启动Activity和“启动Activity2”按钮时,程 序将分别启动子 SubActivityl 和 SubActivity2。吩 2:08 ActivitycommunicationSubActivity 1Input here接受撤销W 2.09 ActivityCommunicatio nSubActivity 2关闭6.1

23、Intent 简介 6.1.2获取Activity返回值在父Activity中获取返回值 SubActivityl提供了 一个输入框,以及“接受”和“撤销”两个按钮。如果在输入框中输入信息后点击“接受”按 钮,程序会把输入框中的信息传递给其父Activity,并在 父Activity的界面上显示。如果用户点击撤销”按钮,则程序不会向父Activity传 递任何信息。 SubActivity2主要是为了说明如何在父Activity中处理多个 子Activity,因此仅提供了用于关闭SubActivity2的“关闭 ”按钮。卫 ActivityCommunicotion凶src由 cdu.hrbc

24、u.ActivityCommunication J ActivityCommunicationActivrtyjava (Z SubActivitylja-oE SubActivity2javagen w “& .、* : );btnCancel. setOnClickListener(new OnClickListener(X public void onClick(Vew viewX setRe$un(RESUlT_CANCELEDr null); finlshQ); 6.1.2获取Activity返回值在父Activity中获取返回值代码第13行将EditText控件的内容作为数据保存在

25、Uri中, 并在第14行代码中构造Intent,在第15行代码中,RESUIT_OK作为结果码,通过调用 setResult()函数,将resuIt设定为返回值。最后在代码第16行调用finish()函数关闭当前的子Activity6.1 Intent 简介 6.1.2获取Activity返回值在父Activity中获取返回值 SubActivity2.java 的核心代码:1.2.public class SubActivity2 extends Activity Overridepublic void onCreate(Bundle savedlnstanceState) .

26、8.9.10super.onCreate( savedlnstanceState); setContentView( R layout. subactiSty2);Button btnRetum = (Button)findViewByld(R.id.btn return);btnReturn.setOnClickListener(new OnClickListener()public void onClick(View view)setResult(RESULT_CANCELED. null); finish(); 6.1.2获取Activity返回值在父Activity中获取返回值在Sub

27、Activity2的代码中,第10行的setResult()函数仅设 置了结果码,第2个参数为null,表示没有数据需要传递给 父 Aclivilyo6.2 Intent过滤器 Intent 解析隐式启动Activity时,并没有在Intent中指明Activity 所在的类,因此,Android索统一定存在某种匹配 机制,使Android系统能够根据Intent中的数据信息 ,找到需要启动的Activity。这种匹配机制是依靠 Android系统中的Intent过滤器(Intent Filter)来实 现的。6.2 Intent过滤器 Intent 解析 Intenti滤器是一种根据Inte

28、nt中的动作(Action) 、类别(Categorie)和数据(Data)等内容,对 适合接收该Intent的组件进行匹配和筛选的机制。 Intentii滤器可以匹配数据类型、路径和协议,还 可以确定多个匹配项顺序的优先级(Priority)。应 用程序的Activity. Service和BroadcastReceiver组 件都可以注册Intent过滤器。这样,这些组件在特 定的数据格式上则可以产生相应的动作。6.2 Intent过滤器 Intent 解析为了使组件能够注册Intent过滤器,通常在 AndroidManifest.xml文件的各个组件下定义 intent-filter节

29、点,然后在intent-filter节点中声 明该组件所支持的动作、执行的环境和数据格式等 信息。当然,也可以在程序代码中动态地为组件设 置Intent过滤器。vintentfilter节点支持action标 签、vcategory标签和data标签,分别用来定义 Intent过滤器的“动作”、“类别”和“数据”。 intent-filter节点支持的标签和属性说明参考表标签性说列android: name折定纽件所能响W的动曲用7?叙1小通常由类&和包的完个兔宜 名构或android:category怖定何种方式丈BB务:nt ent请求的功作Android:bost折定个有效的主机名and

30、roid: Bi me type折定细件繼处理的敗掀类Fandroid:path仃效的URI路径名android: port主机的仃效塔1丨号android :scheae所需唱的转定协仪6.2 Intent过滤器 Intent 解析 category标签用来指定Intent过滤器的服务方式 ,每个Intent过滤器可以定义多个category标签 ,程序开发人员可以使用自定义的类别,或使用 Android系统提供的类别。Android系统提供的类别 可以参考表值说明ALTERNATIVEIntent ftJKtt认幼柞的 个吋衿换的iktfZ/USELECTED.ALTERNATIVEALT

31、ERNATIVE类伍但件换的执竹方汎不览播淀的析出來的KOWSABLE声朝AcHvitynJ以曲浏觅:白动I2FAULT九Intern过池ZS屮淀文的数据捉供戏认动作KXE设铸门动口心示的第个ActivityLAUNCHER在戕用程序启动时幷先被&示6.2 Intent过滤器 Intent 解析这种Intent到Intent过滤器的映射过程称为“Intent 解析”。Intent解析可以在所有的组件中,找到一 个可以与请求的I ntent达成最佳匹配的I ntent过滤器 。Android系统中Intent解析的匹配规则如下: Intent 解析 ( 1 ) Android系统把所有应用程序包

32、中的Intent过滤器集合在一起 ,形成一个完整6 Intent过滤密列衰。 ( 2 )在Intent与Intent过滤器进行匹配时,Android系统会将列表 中所有Intent过滤器的“动作”和“类别”与Intent进行匹配,任何 不匹配的Intent过滤器都将被过滤掉。没有指定“动作”的Intent过 滤器可以匹配任何的Intent,但是没有指定“类别”的Intent过滤器 只能匹配没有“类别”的Intento ( 3 )把Intent数据Uri的每个子部与Intent过滤器的data标签中 的属性进行匹配,如果data标签指定了协议、主机名、路径名 或MIME类型,那么这些属性都要与Intent的Uri数据部分进行匹配 ,任何不匹配的Intent过滤器均被过滤扌点。 (4)如果Intent过滤器的匹配结果多于一个,则可以根据在 intent-filter标签中定义的优丸级标签来对lntenti滤霜进行排序 ,优先级最高的Intent过滤器将被选择。 IntentResolutionDemo示例说明 了 如何在AndroidManifest.xml文件 中注册Intent过滤器,以及如何设養vintent-filter节点属性来捕获 扌旨定6 Intento6.2 Intent过滤器 Intent 解析 AndroidManifest.xml的完整代码如下12manifes

温馨提示

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

评论

0/150

提交评论